WinDbg如何才能看见变量的值

xharry 2007-06-06 11:12:59
我在我的一个程序中,引入了XCrashReport,当程序崩溃的时候,生成一个dump文件
我想通过这个dump文件来查找引起崩溃的代码,代码行是可以找到。我用的是WinDbg。
但是把鼠标移到出错代码附近的变量,不能显示变量的值,WinDbg提示:

Your debugger is not using the correct symbols, in order for this command to work properly, your symbol path must point to .pdb files that have full type infomation.

我已经设置了Source Path和Symbol Path,要不然也不会跳到出错的行,难道我的.pdb没有“full type information",我用的是VS2005, 调试的是C++(非托管)
...全文
2550 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
vitha 2010-02-03
  • 打赏
  • 举报
回复
我也在学习makefile编译链接,用windbg调试的知识,可惜入手很难,有哪位老大能够指点一二吗?谢谢。
孤剑 2009-01-04
  • 打赏
  • 举报
回复
最近在做 windbg 的基础教程,也许能帮上你的忙,可以看看这里:
http://blog.csdn.net/AloneSword/archive/2009/01/03/3696839.aspx
清钟沁桐 2008-10-29
  • 打赏
  • 举报
回复
0:000> !Analyze -v
No export Analyze found

我连 !Analyze -v 命令也不能使用??是在
软件的最后一个编辑框中输入命令吗 ??
nike 2007-07-11
  • 打赏
  • 举报
回复
Hi,
借宝地请教一下WINDBG的调试方法。
我是这样操作的,

1.生成符号信息
更改Relase版的设置(2处):
一、Project Setting ->C/C++
Debug info:
选择Program Database
二、Project Setting ->Link
选中Generate debug info
重新编译
2.安装Windbg
下载安装最新的Windbg
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
3.设定环境变量
对于user32.dll等系统文件,Windbg可以自动从微软网站下载所需的符号信息.我们只需设定_NT_SYMBOL_PATH
这个环境变量告诉Winddbg.方法如下:
我的电脑>右键菜单>属性>高级选项卡>环境变量>系统变量>新建
变量名: _NT_SYMBOL_PATH
变量值:SRV*C:\websymbols* http://msdl.microsoft.com/download/symbols
解释一下: C:\websymbols用来存储系统符号.你可以指定其他的路径.Windbg会自动创建该文件夹
4.设定符号路径
新建一个文件夹,譬如C:\MyAppSymbols
将第一步中生成的Release目录下<youapp>.pdb文件拷贝到该文件夹,该pdb文件包含了调试所需的符号信息.
打开Windbg,选择File>Symbol file path>将C:\MyAppSymbols路径添加进去

5.调试程序
选择 File > Open Executable 然后选择你需要调试的Exe文件,就显示
WARNING: Whitespace at end of path element
CommandLine: C:\test\Release\test.exe
Symbol search path is: SRV*C:\websymbols* http://msdl.microsoft.com/download/symbols
Executable search path is:
ModLoad: 00400000 00405000 test.exe
ModLoad: 77f80000 77ffd000 ntdll.dll
ModLoad: 6bc40000 6bd3b000 C:\WINNT\system32\MFC42.DLL
ModLoad: 78000000 78045000 C:\WINNT\system32\MSVCRT.dll
ModLoad: 77e60000 77f33000 C:\WINNT\system32\KERNEL32.dll
ModLoad: 77f40000 77f7c000 C:\WINNT\system32\GDI32.dll
ModLoad: 77df0000 77e4f000 C:\WINNT\system32\USER32.dll
(318.430): Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=00131f04 ecx=00000009 edx=00000000 esi=7ffdf000 edi=00131f70
eip=77f813b1 esp=0012f984 ebp=0012fc98 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll -
ntdll!DbgBreakPoint:
77f813b1 cc int 3

然后我就用BP来设置断点用F5来执行,显示
ModLoad: 75e00000 75e1a000 C:\WINNT\system32\IMM32.DLL
ModLoad: 796d0000 79732000 C:\WINNT\system32\ADVAPI32.DLL
ModLoad: 786f0000 7875f000 C:\WINNT\system32\RPCRT4.DLL
ModLoad: 6bc20000 6bc2d000 C:\WINNT\system32\MFC42LOC.DLL
ModLoad: 71710000 71794000 C:\WINNT\system32\COMCTL32.DLL
ModLoad: 6dd30000 6dd36000 C:\WINNT\system32\INDICDLL.dll
ModLoad: 10000000 10055000 C:\Program Files\Tencent\RTXC\RTXOLAss.dll
ModLoad: 76af0000 76b2e000 C:\WINNT\system32\comdlg32.dll
ModLoad: 772a0000 77306000 C:\WINNT\system32\SHLWAPI.DLL
ModLoad: 78f90000 791d6000 C:\WINNT\system32\SHELL32.DLL
ModLoad: 777c0000 777de000 C:\WINNT\system32\WINSPOOL.DRV
ModLoad: 79b20000 79b30000 C:\WINNT\system32\MPR.DLL
ModLoad: 7cf00000 7cfef000 C:\WINNT\system32\ole32.dll
ModLoad: 68e90000 68eb9000 C:\WINNT\system32\OLEPRO32.DLL
ModLoad: 77990000 77a2b000 C:\WINNT\system32\OLEAUT32.dll
Breakpoint 0 hit
eax=00000001 ebx=00000001 ecx=0012fac0 edx=00130608 esi=00402300 edi=0012fe94
eip=004014ee esp=0012f99c ebp=0012f9a8 iopl=0 nv up ei ng nz ac pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000296
test!CTestDlg::OnButton1+0xe:
004014ee c3 ret

不知道这样操作有没有什么错误的,
如果是对的,那怎么看它的调试信息?
如果不对,还请各位赐教。
*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll -
这上面的这个提示对调试有没有影响?
谢谢!
我在驱网上问了,没人甩的, 还请各位赐教了。
我的QQ,53183912,如能加我,不胜感激!
feimingbiao 2007-06-19
  • 打赏
  • 举报
回复
你的Windbg是那一版的?是不是太旧了啊?

微软PDB格式变了,你的Windbg太旧,就看不到了。你按我说的办法:

!sym noisy
.reload -f
lml

你能把结果Paste到这里我看看吗?

你的PDB文件有Load起来吗?

另外我们从来不用IDE,都是Make File所以不太知道VC6和VC2005的区别,我的cl.exe的版本是: 14.00.50727.276
zdleek 2007-06-18
  • 打赏
  • 举报
回复
你可以尝试用VS来打开dump文件,然后debug,可以自动定位到出错行,也可以看到变量值
zdleek 2007-06-18
  • 打赏
  • 举报
回复
我在vs2005用,一般可以看到出错行的变量的值,其他行的可能不行
xharry 2007-06-18
  • 打赏
  • 举报
回复
to baodi_z

我的.pdb当然存在了,要不然,我也不可能找到出错的代码

而且在VC6下,我可以看见变量的值,只是VS2005下,看不见变量的值,只能跳到出错的代码行
zdleek 2007-06-18
  • 打赏
  • 举报
回复
楼主看看windug的使用帮助
或许你没有指定symbol服务路径
还有你的程序的.pdb是否存在
xharry 2007-06-18
  • 打赏
  • 举报
回复
我知道怎么回事了,feimingbiao() 你是不是用的是VC6??

我的工程是用VS2005写的,CrashReport用的是codeproject上的XCrashReport生成的

我刚才写了个例子,分别用VC6和VS2005,VC6可以看见变量的值,VS2005就不可以


不知道feimingbiao()兄弟,是什么编译器,你是怎么生成的,谢谢:)
feimingbiao 2007-06-14
  • 打赏
  • 举报
回复

lml

先看看你的程序是不是已经加载了你的Private Symbol(注意你的pdb文件一定是Build用户那个执行文件时候保留下来的,不能重新Build)。

你如果PDB文件没有加载正确的话是不行的。

对于简单的Crash,先用

!Analyze -v

看看。

然后kv看看Stack,dv显示当前变量等等。

我怀疑是你的PDB文件和产生Dump的执行文件对不上。你可以用下列命令搞清楚为什么

!sym noisy
.reload -f

这套东西我天天用,错不了。
xharry 2007-06-14
  • 打赏
  • 举报
回复
feimingbiao() ,你测试了么

我试了,不行。


我本来就是可以找到引起crash的代码的。但是不能看那些代码附件变量的值,我想看它们的值是多少。

P.S.

我用的是 .ecxr 命令

feimingbiao 2007-06-14
  • 打赏
  • 举报
回复
首先要保证ntdll.dll的Symbol一定正确。比较新的Windbg都可以自动找到Microsoft Symbol路径。比如你有一个dump文件叫mycrash.dump, 以下操作大致:

假定你的pdb的路径是 c:\mydir\myprogram.pdb (每次Build之后一定要保留pdb文件,即使Release Build也要产生Pdb)

windbg -z mycrash.dump

进入后:

!symfix <==== 让Windbg能找到微软的Pdb
.sympath+ c:\mydir\ <==== 让Windbg能找到你自己的Pdb
.srcpath c:\mydir\mysourcecode <==== 你源程序的路径
.reload -f

之后就可以看到了。

有时间我写个Blog
xharry 2007-06-08
  • 打赏
  • 举报
回复
顶一下
systemthink 2007-06-06
  • 打赏
  • 举报
回复
總在用六零呢

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧