[调试]_[初级]_[Windbg使用教程-2]

场景

1.我们开发C++程序时, 发布给客户用的是Release模式, 并添加崩溃报告,在程序崩溃退出时,可以通过使用WinDbg来调试崩溃产生的dmp文件.

2.我们也可以用来调试程序, 加断点, 看局部变量,只是这里主要还是讲调试dmp的.

说明

1.Windbg并不是系统标配的, 需要通过SDK下载安装. Debugging Tools for Windows . WinDbg, 一个独立的图形Debug工具, 可以调试用户模式和内核模式. 相当于vs的调试器独立版本,或者说是linux里的gdb. 如果配合Windows SDK的C++编译工具, 甚至不需要VS都可以用SDK自带的编译工具和WinDbg开发程序.

2.获取Windows dll pdb文件可以通过两种方式:
– 方式1: 启动windbg后,在[Symbol Search Path] 对话框中加入下面的路径:
srv*D:\SystemSymbols*http://msdl.microsoft.com/download/symbols
这种方式就是在调试过程中,windbg调试器会从符号表服务器自动下载调试所需的PDB文件.

– 方式2: 预先下载PDB文件,这样能减少调试的等待时间.

"C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe"
c:\windows\system32\user32.dll /s
SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols //下载user32.dll的pdb到
c:\symbols目录中
"C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" c:\windows\system32\ /s
SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols //下载system32下所有dll的pdb到
c:\symbols目录中
"C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" /r c:\windows\system32\
/s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols //递归子目录下载system32下
所有dll的pdb到c:\symbols目录中

3.设置 _NT_SYMBOL_PATH 环境变量, 值就是pdb的放置目录. 这样vs和windbg可以通过这个配置变量查找系统的PDB文件.

4.Debugging工具目录还有其他辅助debug工具, 可以参考自带的chm官方文件看使用说明.

C:\Program Files\Debugging Tools for Windows (x64)

比如使用 ntsd.exe 来结束顽固的进程. ntsd -c q -p 6948

A user-mode debugger with a console interface. CDB and NTSD are virtually identical. 
In this documentation, whenever a reference is made to "CDB", 
it applies to both CDB and NTSD. When these two debuggers differ, 
it is noted. (See CDB and NTSD for details.) 

例子

分析一个dmp文件, 把dmp文件拖放到windbg窗口里. 接着设置 File->Symbol File Path…设置当前程序的PDB文件所在的目录. 之后勾选 reload, 确认.

1.在命令窗口输入 .ecxr 回车, 这个命令显示当前异常所在的上下文记录,还有当前上下文的寄存器的值. 之后WinDbg会把异常上下文当成寄存器上下文. 并且这时可以查询很多数据, 比如堆栈信息, 本地变量值.

当前异常的上下文记录, mov dl,byte ptr [ecx] 这个就是造成崩溃的原因:

0:007> .ecxr
eax=00000000 ebx=0941f6c4 ecx=00000000 edx=00000000 esi=00000001 edi=0941f524
eip=6785bd90 esp=0941f404 ebp=0941f474 iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010202
libComm!FilePacketUtil::ConvertJsonToFileHeader+0x80:
6785bd90 8a11            mov     dl,byte ptr [ecx]          ds:002b:00000000=??

查看异常的调用栈

0:007> kn
  *** Stack trace for last set context - .thread/.cxr resets it
 # ChildEBP RetAddr  
00 0941f474 678a60d9 libComm!FilePacketUtil::ConvertJsonToFileHeader+0x80 [d:\software\47.android\projects\gui\libcomm\src\common\file\file_packet_util.cpp @ 54]
01 0941f7a4 67886cfd libComm!ModuleFile::RecvTaskFileExport+0x999 [d:\software\47.android\projects\gui\libcomm\src\module\module_file.cpp @ 133]
02 0941fbb8 68e64697 libComm!RecvServerPacket+0x132d [d:\software\47.android\projects\gui\libcomm\src\libcomm.cpp @ 712]

查看第0帧,通过kn反馈的的最左边的数值表明了帧数.

0:007> .frame 0
00 0941f474 678a60d9 libComm!FilePacketUtil::ConvertJsonToFileHeader+0x80 [d:\software\47.android\projects\gui\libcomm\src\common\file\file_packet_util.cpp @ 54]

查看本地变量, 这里显示有些错误,比如 fh是引用, 怎么可能是0?所以也搞不懂.

0:007> dv /v
Unable to find processor type for C:\Program Files (x86)\Android\Plugins\Comm\libComm.dll, using default
@ecx              fh = 0x00000000
@edx           value = 0x00000000
0941f444             fbs = 0x0941f6c4
0941f414              fb = class FileBlock

其他:

1.菜单 Help->Contents 可以打开官方的 chm格式文档帮助查阅文档.

2.菜单 View->Locals 或者 Registers 或者 Call stack也是可视化的查阅方式,也相当方便.

Locals

Registers

Call Stack

3.如何生成崩溃报告, 转到这里 Release程序的崩溃报告minidump解决方案

参考

Windbg的官方文档 Debugging tools for Windows

windbg调试基础

Windbg调试—-Windbg入门

Windbg使用教程

术语

ChildEBP: the base pointer for the stack frame
RetAddr: return address
Callee-BSP: a pointer to the function
Return-RA: return address

Addrs displays various frame-related addresses. On an x86-based processor, 
this display includes the base pointer for the stack frame ("ChildEBP") and 
the return address ("RetAddr"). On an Itanium-based processor, 
this display includes a pointer to the function that is being called ("Callee-BSP") and 
the return address ("Return-RA"), unless both the Args and 
Nonvolatile regs buttons are turned on as well. 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter(阿斯拉达)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值