说明:本文很早就发布在我的博客上了,当时总结的有些问题,本次重新整理完善后再次发布。
前言
有时候我们非常想知道当前系统内核的一些状态,比如查看当前系统加载了哪些驱动,查看某个进程外 COM 调用卡在哪里了,等等。如果我们可以调试系统内核,或者抓取一个系统转储来做事后调试,该多好啊。我们可以通过如下方法得到系统转储:
- 双机内核调试(需要另外一台机器来做双机调试)
- 让系统崩溃(可以使用
sysinternals中的notmyfault或者 使用快捷键让系统崩溃,并设置 系统崩溃的时候自动保存转储文件)(有点小题大作了:joy:)。 - 使用
sysinternals中的livekd,不需要特殊设置,绿色环保。
以上几种方案中,使用 livekd 最方便快捷。如果有哪位小伙伴儿对其它几种方法感兴趣,可以查看之前的转储系列文章。为了能顺利使用 livekd,我们需要解决几个问题。
使用帮助
- 可以运行
livekd -?来查看使用方法。
- 通过
-k来指定kd.exe的路径。 - 通过
-m来指定使用windbg而不是kd.exe作为内核调试器。 - 可以传递参数给
kd.exe或者windbg.exe。
问题总结
使用
livekd进行本地内核调试,需要管理员权限,没以管理员权限运行会给出对应的错误提示。
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
livekd需要内核调试器(kd.exe或windbg.exe)的支持,可以通过命令行参数-k指定kd.exe的完整路径。通过-k参数指定kd.exe的路径的时候,如果有空格,需要用""包起来,否则可能报如下错误:
- 下载符号文件需要
symsrv.dll和dbghelp.dll的支持,请确保livekd可以顺利加载这两个文件。
如果出现上图中的错误,请按照提示加上-vsym再次运行,可以查看到更详细的问题。我这里是因为不能加载symsrv.dll导致的。
如果以上都已经设置正确,但还是报错,可以使用
-vsym参数查看具体的错误提示。因为最近微软符号服务器在国内连接有点困难。所以大概率会遇到下面的问题。
遇到这个问题,没有什么好的解决办法。只能想办法连上微软符号服务器,或者先下载一份对应的文件,放到对应的查找路径下。
说明:
- 尽量加载与系统版本一致的
kd.exe,livekd.exe会根据系统版本运行对应版本的程序(64位系统运行64位的livekd.exe)。一般情况下kd.exe目录下会有对应版本的symsrv.dll,livekd.exe会到kd.exe目录下加载symsrv.dll。- 如果还是找不到依赖的文件,我们可以把依赖的文件拷贝到
livekd.exe同目录下再运行。
- 如果以上几步设置好了,运行
livekd应该没问题了。剩下的就是通过livekd -?来熟悉用法了,祝各位好运。贴一张正常运行的效果图。:smile:
说明:
如果之前没加载过符号文件的话,可能会花一定的时间加载符号。请耐心等待。
总结
livekd可以非常方便的获取一份系统转储,不用预先做任何设置,真是太有用了。-vsym可谓是排查livekd不能正常工作的首要选项。遇到问题,加上它就对了。调试符号对于调试是极其重要的。
参考资料
[Forcing a System Crash from the Keyboard][10]
[Remote Debugging Through the Debugger][12]
[Generate a kernel or complete crash dump][13]