2010-05-14 77 views
0

在调试过程中使用其核心转储时出现以下错误。Windows调试 - WinDbg

0:000> !lmi test.exe 
Loaded Module Info: [test.exe] 
     Module: test 
    Base Address: 00400000 
    Image Name: test.exe 
    Machine Type: 332 (I386) 
    Time Stamp: 4a3a38ec Thu Jun 18 07:54:04 2009 
      Size: 27000 
     CheckSum: 54c30 
Characteristics: 10f 
Debug Data Dirs: Type Size  VA Pointer 
       MISC 110,  0, 21000 [Debug data not mapped] 
        FPO 50,  0, 21110 [Debug data not mapped] 
      CODEVIEW 31820,  0, 21160 [Debug data not mapped] - Can't validate symbols, if present. 
    Image Type: FILE  - Image read successfully from debugger. 
       test.exe 
    Symbol Type: CV  - Symbols loaded successfully from image path. 
    Load Report: cv symbols & lines 

是否有任何机构知道错误CODEVIEW 31820, 0, 21160 [Debug data not mapped] - Can't validate symbols, if present.究竟是什么意思?

这个错误是否意味着我无法从可执行文件读取公共/私人符号?

如果不是这样,为什么WinDbg调试器会抛出这种错误?

在此先感谢, Santhosh。

回答

0

您是否为WinDbg设置了符号路径(请参阅步骤2 @http://blogs.msdn.com/iliast/archive/2006/12/10/windbg-tutorials.aspx)并且是符号路径中的PDB文件?

我假设您正在测试一个内置于调试模式下的可执行文件,该模式会生成必要的PDB文件。

+0

我用二进制编译了-Z7标志。因此代码视图符号嵌入在可执行文件中。 仍然有必要有.pdb文件的可执行文件? – Santhosh77 2010-05-14 11:07:28

+0

我相信WinDbg支持PDB中的符号和更老的DBG格式。您可能必须使用-Zi开关(http://msdn.microsoft.com/en-us/library/958x11bc(VS.80).aspx)编译您的二进制文件,并确保包含PDB文件的文件夹位于符号路径。我需要提到的是,以上是来自我对另一个类似调试器的体验,而不是WinDbg。这些概念应该是相似的。 – anonymous 2010-05-14 13:44:24

1

未映射的调试数据可能意味着包含调试信息的可执行文件部分尚未映射到内存中。如果这是故障转储,您的选择是有限的,但如果它是一个实时调试会话。您可以使用WinDbg .pagein命令来检索数据。要做到这一点,你需要知道页面的地址。如果你在模块开始地址上使用!dh命令(你可以用lm看到 - 在我的情况下,为msvcr90.dll输入lm mmsvcr90),你可能会看到类似于这个(向下滚动一个方法):

Debug Directories(1) 
    Type  Size  Address Pointer 
    cv   29  217d0 20bd0 Can't read debug data cb=0 

这说明你的调试数据在偏移217d0从模块开始,其长度为29。如果你试图倾倒你会看到这些字节(78520000是模块的起始地址):

kd> db 78520000+217d0 l29 
785417d0 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ???????????????? 
785417e0 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ???????????????? 
785417f0 ?? ?? ?? ?? ?? ?? ?? ??-??      ????????? 

如果执行.pagein/p 82218b90 785417d0,然后F5,当调试打破回来你会看到(82218b90是过程的_EPROCESS地址,我'm调试):

kd> db 78520000+217d0 l29 
785417d0 52 53 44 53 3f d4 6e 7a-e8 62 44 48 b2 54 ec 49 RSDS?.nz.bDH.T.I 
785417e0 ae f1 07 8c 01 00 00 00-6d 73 76 63 72 39 30 2e ........msvcr90. 
785417f0 69 33 38 36 2e 70 64 62-00      i386.pdb. 

现在正在执行.reload/f msvcr90.dll将加载符号。对于故障转储,如果您可以找到您丢失的0x29字节(可能来自另一个转储),则可以插入它们并获取以此方式加载的符号。