ntsd生成dump文件:
在Linux下,如果有内存访问异常等问题,可以生成core文件,协助开发人员定位问题所在。那么在Windows下,出现类似问题怎么办?其实Windows下也有类似的命令行工具——ntsd,可以用来生成dump文件,然后使用WinDbg进行分析。
ntsd的生成dump文件的方式为: ntsd -pv -p $PID -c ".dump /mf d:\aaa.dmp"。
或者,先是ntsd -pv -p $PID进入交互式命令提示,然后再输入.dump /mf d:\aaa.dmp
其中$PID,是进程的PID,需要从任务管理器中查到。
前言:之前介绍了利用VS2005进行Dump文件的调试,功能非常强大。但VS2005是一个大程序,本文将讨论利用NTSD的Command Line 实现Dump 文件的调试。
1、 载入DMP格式文件
利用CMD打开命令行窗口,切换到NTSD所在目录。利用命令载入DMP文件:
ntsd –z dumpfileName –y symbolPath –srcpath sourcecodePath
dumpfileName:DMP格式文件路径
symbolPath:PDB文件路径
sourcecodePath:程序的源代码路径
如图1.1,若载入成功,将弹出一个NTSD窗口,如图1.2。
图1.1 载入DMP格式文件
图1.2 NTSD界面
红色的圈中显示了BUG的原因,函数IsPrefix 存在错误。0x36是错误相对于函数的偏移值。这个错误是一个Access Violation的异常,异常地址为00401036。
Note:
l 若路径中存在空格,需要用在路径前后加上引号。
l 若提示错误,根据提示查看是否由于dbghelp.dll不存在导致,安装的调试工具包中存在该动态库。
2、 定位与源代码
利用如下命令可以定位错误到源代码中:
lsp –a 500
lsa .
第一行命令用于设置显示的源代码行数,第二行命令将错误定位与错误行。如图:
图1.3 Analysis Result: Line of Source Code Causing Crash
从图中可以看出,第13号是导致程序错误的位置。如果希望看到变量的值,使用命令:
x
若需要详细查看某个变量的值,使用命令:
?? variableName
图1.4 Analysis Result: Value of Variable Causing Crash
Module Address of Your Application(显示程序模块地址)
Command:
x *!
图1.5 Application Module Information
It shows all the module address in your application.
Crash Stack Trace(显示程序调用堆栈)
If you want to trace the stack of application, use this command:
Command:
kb
图1.6 Application Stack Trace
It shows that function main invokes function IsPrefix then application crashes.
For more commands of NTSD, refer to debugger.chm in Microsoft Debugger Tools package.