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

Windows:Windbg

1. 把.dmp文件和程序编译对应的.pdb文件放一起.

2. 启动Windbg,dmp文件拖进windbg.

3. 在windbg控制台里输入.ecxr

3.1 如果.ecxr看不到对应的源码值, 两种情况, 一个是源文件路径没配置. 需要在File->Source File Path里设置源文件所在目录, 第二种情况是直接打开相关源文件. 

如果还是显示不了源文件, 这个真没办法解决, 因为有些崩溃报告也是定为不到行(同版本)比如给0x0地址赋值时,没找到原因.

如果没有找到pdb文件,它会有提示说找不到xxx Symbol.并且是看不到函数调用栈的, 需要在File-> Symbol File Path, 这里也是设置pdb文件的目录,勾选Reload 确定重新加载.

3.2 当定位不到行时,可以用命令 !analyze -v 来分析这个dump文件, 能看到很多有用信息, 也能直接看到调用栈.

比如: 在 

ire.cpp 668行的调用了fread崩溃


00000000`0021e810 000007fe`f3ddb58c : 00000000`72f82650 00000000`0021f250 00000001`3f2d32c3 000007fe`f3df2dbb : msvcr100!fread+0x18
00000000`0021e850 00000001`3f2c1d57 : 00000000`0000001a 00000000`0000001a 00000000`0000001a 00000000`002ebe70 : libIRE!PBASObserverCallbackFunc+0x7c [e:\work\xx\libxx\src\ire.cpp @ 667]

FILE* file = fopen("C:\\1.yy","r");
char buf[4];
fread(buf,4,1,file);


!analyze -v 分析的部分结果.

 0xf4af3590
00000000`0021e110 00000000`72f40468 : 00000000`00000002 00000000`00000000 00000000`00000000 ffffffff`ffffff00 : msvcr100!wmktemp+0x241
00000000`0021e720 00000000`72f404f6 : 00000002`00000001 00000000`1b484a8c 00000000`00000000 00000000`72ef20da : msvcr100!invoke_watson+0x18
00000000`0021e750 00000000`72f40519 : 00000000`00000000 00000000`0021e8f9 00000000`00000001 00000000`72efddba : msvcr100!invalid_parameter+0x6e
00000000`0021e790 00000000`72efeb91 : 00000000`00000180 00000000`00000003 00000000`01dc1300 00000000`002e89c0 : msvcr100!invalid_parameter_noinfo+0x19
00000000`0021e7d0 00000000`72efec00 : 00000000`0021f250 00000001`3f2d32c3 000007fe`f3df2dbb 00000000`0021f250 : msvcr100!fread_s+0x59
00000000`0021e810 000007fe`f3ddb58c : 00000000`72f82650 00000000`0021f250 00000001`3f2d32c3 000007fe`f3df2dbb : msvcr100!fread+0x18
00000000`0021e850 00000001`3f2c1d57 : 00000000`0000001a 00000000`0000001a 00000000`0000001a 00000000`002ebe70 : libIRE!PBASObserverCallbackFunc+0x7c [e:\work\xx\libxx\src\ire.cpp @ 667]
00000000`0021e960 00000001`3f2c3b46 : 00000000`00000000 000007fe`f3cdbb92 00000000`00000000 000007fe`f3cdbb92 : gui!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,HICON__ * __ptr64,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,HICON__ * __ptr64> >,0> >::_Tidy+0x317
00000000`0021ea40 000007fe`f3cd8472 : 00000000`00000011 00000000`00000011 00000000`01dbc340 000007fe`f3ce1630 : gui!std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,HICON__ * __ptr64,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,HICON__ * __ptr64> > >::~map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,HICON__ * __ptr64,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,HICON__ * __ptr64> > >+0x12a6
00000000`0021f230 000007fe`f3cd6e1c : 000007fe`f3ce1630 00000000`00000111 00000000`00001389 00000000`0000


4. 左边窗口会出现对应的源代码和出现的行.

 

 

 

5. 点击菜单View->Locals 查看局部变量.

6. 如果局部变量里看不到值,可以看寄存器变量值, eax,esi都是0,调用了idiv操作.

 

命令:

k : 看崩溃堆栈信息

.ecxr : (Display Exception Context Record)

.!analyze -v    分析dump文件

.frame 当前frame

.f+ 上一frame

.f-  下一frame

dv  显示局部变量值


备注: 要生成pdb文件,必须在Release模式下的 项目属性-> 配置属性-> 链接器->调试-> 生成调试信息 选(是)

其他更详尽的信息参考:


http://www.cnblogs.com/playerken/p/4000438.html



Windbg是一款用于Windows调试的工具,可以用来分析dmp文件。以下是使用Windbg的教程: 1. 下载Windbg:你可以从Windows 10 SDK中下载Windbg,或者在已安装Windows 10 SDK的情况下,在控制面板的程序中选择安装Debugging Tools For Windows。 2. 准备dmp文件:你可以通过使用Windows管理器的"创建转储文件"功能来生成dmp文件,或者使用Windbg附加到进程的方式,在程序运行到出错位置后生成dmp文件。 3. 打开dmp文件:你可以使用Windbg或者Visual Studio来打开dmp文件进行分析。如果是通过"创建转储文件"生成的dmp文件,可以使用Windbg或者Visual Studio打开。如果是通过Windbg附加到进程后生成的dmp文件,可以使用Windbg打开。 4. 分析dmp文件:使用Windbg打开dmp文件后,你可以使用各种Windbg命令来分析和调试程序。你可以参考相关的参考文章和教程来学习如何使用Windbg进行调试。 需要注意的是,使用Visual Studio打开通过Windbg附加到进程生成的dmp文件时可能会提示版本过旧无法打开。这是因为Visual Studio和Windbg使用的调试引擎不同。在这种情况下,建议使用Windbg来分析dmp文件。 希望这个教程对你有帮助! #### 引用[.reference_title] - *1* *2* *3* [windbg使用教程调试异常及死锁等)](https://blog.csdn.net/baidu_38621657/article/details/110942007)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Peter(阿斯拉达)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值