我在我的一个程序中,引入了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++(非托管)

解决方案 »

  1.   

    首先要保证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
      

  2.   

    feimingbiao() ,你测试了么我试了,不行。
    我本来就是可以找到引起crash的代码的。但是不能看那些代码附件变量的值,我想看它们的值是多少。P.S.我用的是 .ecxr 命令
      

  3.   


    lml先看看你的程序是不是已经加载了你的Private Symbol(注意你的pdb文件一定是Build用户那个执行文件时候保留下来的,不能重新Build)。你如果PDB文件没有加载正确的话是不行的。对于简单的Crash,先用!Analyze -v看看。然后kv看看Stack,dv显示当前变量等等。我怀疑是你的PDB文件和产生Dump的执行文件对不上。你可以用下列命令搞清楚为什么!sym noisy
    .reload -f这套东西我天天用,错不了。
      

  4.   

    我知道怎么回事了,feimingbiao() 你是不是用的是VC6??我的工程是用VS2005写的,CrashReport用的是codeproject上的XCrashReport生成的我刚才写了个例子,分别用VC6和VS2005,VC6可以看见变量的值,VS2005就不可以
    不知道feimingbiao()兄弟,是什么编译器,你是怎么生成的,谢谢:)
      

  5.   

    楼主看看windug的使用帮助
    或许你没有指定symbol服务路径
    还有你的程序的.pdb是否存在
      

  6.   

    to baodi_z我的.pdb当然存在了,要不然,我也不可能找到出错的代码而且在VC6下,我可以看见变量的值,只是VS2005下,看不见变量的值,只能跳到出错的代码行
      

  7.   

    你可以尝试用VS来打开dump文件,然后debug,可以自动定位到出错行,也可以看到变量值
      

  8.   

    你的Windbg是那一版的?是不是太旧了啊?微软PDB格式变了,你的Windbg太旧,就看不到了。你按我说的办法:!sym noisy
    .reload -f 
    lml你能把结果Paste到这里我看看吗?你的PDB文件有Load起来吗?另外我们从来不用IDE,都是Make File所以不太知道VC6和VC2005的区别,我的cl.exe的版本是: 14.00.50727.276
      

  9.   

    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,如能加我,不胜感激!
      

  10.   

    0:000> !Analyze   -v 
    No export Analyze found 我连 !Analyze   -v 命令也不能使用??是在 
    软件的最后一个编辑框中输入命令吗 ??
      

  11.   

    最近在做 windbg 的基础教程,也许能帮上你的忙,可以看看这里:
    http://blog.csdn.net/AloneSword/archive/2009/01/03/3696839.aspx
      

  12.   

    我也在学习makefile编译链接,用windbg调试的知识,可惜入手很难,有哪位老大能够指点一二吗?谢谢。