查看当前线程的调用堆栈
kb
查看全部线程的调用堆栈
~*kb
显示分析的详细信息
!analyze -v
继续执行
g
查看线程详细信息,例如线程入口地址
~21 (数字代表线程id)
查看变量地址
x 变量名,可以用通配符
例如
x 05memcorrupt!g_*
用给定类型查看对象
dt 类型名 地址
例如
dt CAppInfo 0x00032cb0
查看给定地址的内容
dd 地址
例如
dd 0x72726443
以下都是看内容,显示的形式不同而已
dc
du
dds
dpp
dpa
dpu
查看当前指令
u eip
查看给定地址的代码内容
u 7c80540f
查看加载的全部模块的起始地址
lm
同时包含起始和结束的信息
展开当前调用栈的内容
dd esp esp+100
注意这里要用正数,注意栈的生长方向
查看给定代码地址对应的模块
ln 0100156a
顺便提一下,我们不需要等到发生异常才能去调试一个进程。任何时候都可以通过运行vsjitdebugger.exe -p PID 来让调试器附着到任意进程,PID表示要调试的进程的ID.
事实上,Windows任务管理器使得调试进程更加容易,我们可以打开“进程”属性页,选择一个进程,并单击鼠标右键,然后选择“Debug”.
生成dump文件可以通过设置让系统在程序错误时生成,也可以手动生成dump文件
1、如何手动生成dump文件
程序崩溃(crash)的时候,可以使用WinDBG要把当时程序内存空间数据都保存下来,生成的文件称为dump 文件。
步骤:
1) 打开WinDBG并将之Attach 到crash的程序进程
2) 输入产生dump 文件的命令
WinDBG产生dump 文件的命令是 .dump ,可以选择不同的参数来生成不同类型的dump文件。
选项(1): /m
命令行示例:.dump /m C:\dumps\myapp.dmp
注解: 缺省选项,生成标准的minidump, 转储文件通常较小,便于在网络上通过邮件或其他方式传输。 这种文件的信息量较少,只包含系统信息、加载的模块(DLL)信息、 进程信息和线程信息。
选项(2): /ma
命令行示例:.dump /ma C:\dumps\myapp.dmp
注解: 带有尽量多选项的minidump(包括完整的内存内容、句柄、未加载的模块,等等),文件很大,但如果条件允许(本机调试,局域网环境), 推荐使用这中dump。
选项(3):/mFhutwd
命令行示例:.dump /mFhutwd C:\dumps\myapp.dmp
注解:带有数据段、非共享的读/写内存页和其他有用的信息的minidump。包含了通过minidump能够得到的最多的信息。是一种折中方案。