使用WinDbg转储STL字符串

时间:2011-07-06 16:47:57

标签: windbg

我不能再使用WinDbg转储STL字符串 - 我曾经能够使用命令dt -r (MSVCP90!string) address转储STL字符串,或者使用宽字符串dt -r (MSVCP90!wstring) address转储STL字符串。不幸的是我不能再这样了 - 我有一个符号路径,当我列出模块时,它显示符号是为MSVCP90加载的:

74110000 7419e000 MSVCP90 (pdb symbols) x:\symbols\msvcp90.i386.pdb\A23D796E66BB430B891568A6EF0C750C1\msvcp90.i386.pdb

当我执行命令时,我得到的输出是:

0:025> dt -r (MSVCP90!string)
*************************************************************************
***                                                                   ***
***                                                                   ***
***    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 information.      ***
***                                                                   ***
***    Certain .pdb files (such as the public OS symbols) do not      ***
***    contain the required information.  Contact the group that      ***
***    provided you with these symbols if you need this command to    ***
***    work.                                                          ***
***                                                                   ***
***    Type referenced: MSVCP90!string                                ***
***                                                                   ***
*************************************************************************
Symbol MSVCP90!string not found.

我的符号路径设置如下:

0:025> .sympath
Symbol search path is: srv*X:\Symbols*http://msdl.microsoft.com/download/symbols
Expanded Symbol search path is: srv*x:\symbols*http://msdl.microsoft.com/download/symbols

我找到了SDbgExt扩展,但是从我读到的是7.0版本的运行时 - 这是9.0。

有没有人知道为什么这个功能已经停止工作?没有它我真的活不下去!

谢谢!

编辑:为了更好的衡量,我也尝试启用嘈杂的符号模式。我得到了这个输出:

0:025> .reload /f MSVCP90.dll
DBGHELP: MSVCP90 - public symbols  
         x:\symbols\msvcp90.i386.pdb\A23D796E66BB430B891568A6EF0C750C1\msvcp90.i386.pdb

所以看起来我的符号很好。

5 个答案:

答案 0 :(得分:6)

您也可以使用

!stl <name>

来自文档:

  

!stl扩展名显示了一些已知的标准模板库(STL)模板。   此扩展程序目前支持以下类型的STL模板:stringwstringvector<string>vector<wstring>list<string>list<wstring>和指向任何前述类型。

答案 1 :(得分:4)

如果它仅用于STL字符串,则可以手动转储字符串。这很容易。唯一的轻微复杂性是由于STL字符串可以在结构内部保留短字符串(并且更长的字符串总是在堆中)。 STL字符串以sting本身(非常短的一个)或指向字符串的指针开始。这两个命令将转储单字节字符串:

da <address>
da poi <address>

请记住,只有一个命令会实际显示字符串 - 通常可以通过输出找出。如果不确定,dd <address> + 0x10 l1是字符串的长度。

类似于宽字符串:

du <address>
du poi <address>

答案 2 :(得分:1)

公共符号没有类型信息。您需要为DLL找到“私有”符号。您还可以使用可执行文件/ DLL进行类型定义。

答案 3 :(得分:1)

尝试&#39; dx&#39;命令,很好地显示了std :: string内容

我认为&#39; dx&#39;是Windows 10中的新功能

dx(显示NatVis表达式) https://msdn.microsoft.com/en-us/library/windows/hardware/dn936815(v=vs.85).aspx

答案 4 :(得分:0)

  1. 创建脚本mystr.txt

    $$保存到文件myStr.txt .if(@@ C ++($ {$ arg1} - &gt; _Mypair._Myval2._Mysize)&lt; 16){ da @@ C ++($ {$ arg1} - &gt; _Mypair._Myval2._Bx._Buf) } .else { da @@ C ++($ {$ arg1} - &gt; _Mypair._Myval2._Bx._Ptr) }

  2. 2。 用参数调用脚本 例如

    $$>a<c:\mystr.txt strVarName
    
    1. 查看stl字符串内容。