使用WinDbg转储STL字符串

使用WinDbg转储STL字符串,windbg,Windbg,我再也不能用WinDbg转储STL字符串了-我以前可以使用命令转储STL字符串:dt-r(MSVCP90!string)address,或者对于宽字符串,dt-r(MSVCP90!wstring)address。不幸的是,我不能再这样做了-我有一个符号路径,当我列出模块时,它显示为MSVCP90加载了符号: 741100007419E000 MSVCP90(pdb符号)x:\symbols\MSVCP90.i386.pdb\A23D796E66BB430B891568A6EF0C750C1\MS

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

741100007419E000 MSVCP90(pdb符号)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

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

公共符号没有类型信息。您需要找到DLL的“专用”符号。您还可以将可执行文件/DLL用于类型定义

如果只是针对STL字符串,则可以手动转储字符串。这很容易。唯一稍微复杂的是,STL字符串可以在结构中保留短字符串(较长的字符串总是在堆中)。STL字符串以sting本身(非常短的一个)或指向该字符串的指针开始。这两个命令将转储单字节字符串:

da <address>
da poi <address>
da
大埔
请记住,实际上只有一个命令会显示字符串——您通常可以通过输出来判断。如果不确定,
dd+0x10 l1
是字符串的长度

类似地,对于宽字符串:

du <address>
du poi <address>
du
杜波
您也可以使用

!stl <name>
!stl
从文档中:

!stl
extension显示一些已知的标准模板库(stl)模板。 此扩展当前支持以下类型的STL模板:
string
wstring
vector
vector
list
list
,以及指向前面任何类型的指针


尝试使用“dx”命令,可以很好地显示std::string内容

我认为“dx”在Windows10中是新出现的

dx(显示NatVis表达式)

  • 创建脚本mystr.txt

    $$保存到文件myStr.txt .if(@@C++(${$arg1}->\u Mypair.\u Myval2.\u Mysize)\u Mypair.\u Myval2.\u Bx.\u Buf) }.其他{ da@@C++(${$arg1}->\u Mypair.\u Myval2.\u Bx.\u Ptr) }

  • 二,。 使用参数调用脚本 e、 g


    $$>aI没有我正在调试的exe的符号。但它过去工作得很好。是否有任何方法可以获得MSVCP90的私有符号或包含我需要的结构的符号?另外,如果是公共符号没有类型信息的情况,为什么可以从ntdll(dt-r nt!\u PEB)中转储PEB结构?您可以使用完整符号编译自己的DLL,并使用
    强制加载。重新加载/f mydll=777777,1
    。如果字符串的STL实现在不同版本之间没有更改,则可以加载msvcp60或以这种方式工作的任何版本。
    $$>a<c:\mystr.txt strVarName