本地內核調試神器:livekd 使用總結
摘要:2. livekd 需要內核文件的調試符號的支持。1. 使用 livekd 進行本地內核調試,需要管理員權限,沒以管理員權限運行會給出對應的錯誤提示。
說明:本文很早就發佈在我的博客上了,當時總結的有些問題,本次重新整理完善後再次發佈。
前言
有時候我們非常想知道當前系統內核的一些狀態,比如查看當前系統加載了哪些驅動,查看某個進程外 COM
調用卡在哪裏了,等等。如果我們可以調試系統內核,或者抓取一個系統轉儲來做事後調試,該多好啊。我們可以通過如下方法得到系統轉儲:
1. 雙機內核調試(需要另外一臺機器來做雙機調試)
2. 讓系統崩潰(可以使用 sysinternals
中的 notmyfault
或者 使用快捷鍵讓系統崩潰,並設置 系統崩潰的時候自動保存轉儲文件)(有點小題大作了)。
3. 使用 sysinternals
中的 livekd
,不需要特殊設置,綠色環保。
以上幾種方案中,使用 livekd
最方便快捷。如果有哪位小夥伴兒對其它幾種方法感興趣,可以查看之前的轉儲系列文章。爲了能順利使用 livekd
,我們需要解決幾個問題。
使用幫助
-
可以運行
livekd -?
來查看使用方法。
-
通過
-k
來指定kd.exe
的路徑。 -
-m windbg kd.exe
-
可以傳遞參數給
kd.exe
或者windbg.exe
。
問題總結
1. 使用 livekd
進行本地內核調試,需要管理員權限,沒以管理員權限運行會給出對應的錯誤提示。
2. livekd
需要內核文件的調試符號的支持。 可以通過環境變量 _NT_SYMBOL_PATH
來告訴 livekd
到哪裏加載調試符號。 如果沒設置也沒關係, livekd
會自動下載需要的調試符號到某個位置,遇到下圖的情況,輸入 y
即可。
-
也可以通過命令行參數
-y
來指定符號路徑。與使用_NT_SYMBOL_PATH
效果一樣。最好設置環境變量_NT_SYMBOL_PATH
,對所有調試器都有用。 -
我本地的設置爲:
_NT_SYMBOL_PATH=SRV*C:\mssymbols\*http://msdl.microsoft.com/download/symbols
3. livekd
需要內核調試器( kd.exe
或 windbg.exe
)的支持,可以通過命令行參數 -k
指定 kd.exe
的完整路徑。 通過 -k
參數指定 kd.exe
的路徑的時候,如果有空格,需要用 ""
包起來,否則可能報如下錯誤:
4. 下載符號文件需要 symsrv.dll
和 dbghelp.dll
的支持,請確保 livekd
可以順利加載這兩個文件。 如果出現上圖中的錯誤,請按照提示加上 -vsym
再次運行,可以查看到更詳細的問題。我這裏是因爲不能加載 symsrv.dll
導致的。
5. 如果以上都已經設置正確,但還是報錯,可以使用 -vsym
參數查看具體的錯誤提示。因爲最近微軟符號服務器在國內連接有點困難。所以大概率會遇到下面的問題。
遇到這個問題,沒有什麼好的解決辦法。只能想辦法連上微軟符號服務器,或者先下載一份對應的文件,放到對應的查找路徑下。
說明:
-
kd.exe livekd.exe 64 64 livekd.exe kd.exe symsrv.dll livekd.exe kd.exe symsrv.dll
-
如果還是找不到依賴的文件,我們可以把依賴的文件拷貝到
livekd.exe
同目錄下再運行。
6. 如果以上幾步設置好了,運行 livekd
應該沒問題了。剩下的就是通過 livekd -?
來熟悉用法了,祝各位好運。貼一張正常運行的效果圖。
說明:如果之前沒加載過符號文件的話,可能會花一定的時間加載符號。請耐心等待。
總結
-
livekd
可以非常方便的獲取一份系統轉儲,不用預先做任何設置,真是太有用了。 -
-vsym
可謂是排查livekd
不能正常工作的首要選項。遇到問題,加上它就對了。 -
調試符號對於調試是極其重要的。
猜你喜歡:
轉儲文件系列:
使用 VMware + win10 + VirtualKD + windbg 從零搭建雙機內核調試環境
調試系列:
調試實戰——你知道怎麼使用DebugView查看調試信息嗎?
調試實戰——崩潰在ComFriendlyWaitMtaThreadProc
調試實戰——使用windbg調試崩潰在ole32!CStdMarshal::DisconnectSrvIPIDs
排錯系列:
排錯實戰——使用process explorer替換任務管理器
排錯實戰——通過對比分析sysinternals事件修復程序功能異常
VS 系列:
排錯實戰——解決c++編譯錯誤:error C2059: illegal token on right side of '::'
善用 vs 中的錯誤列表和輸出窗口,高效查找 C++ 多工程編譯錯誤
歡迎留言交流!