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