Дамп STL-строк с WinDbg - PullRequest
2 голосов
/ 06 июля 2011

Я больше не могу выводить строки STL с помощью WinDbg - раньше я мог выводить строки STL с помощью команды: dt -r (MSVCP90!string) address или для широких строк dt -r (MSVCP90!wstring) address. К сожалению, я больше не могу этого делать - у меня есть путь к символам, и когда я перечисляю модули, это показывает, что символы загружаются для 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 ]

6 голосов
/ 22 августа 2013

Вы также можете использовать

!stl <name>

Из документов:

Расширение !stl отображает некоторые из известных шаблонов Стандартной библиотеки шаблонов (STL). В настоящее время это расширение поддерживает шаблоны STL следующих типов: string, wstring, vector<string>, vector<wstring>, list<string>, list<wstring> и указатели на любой из предыдущих типов.

4 голосов
/ 07 июля 2011

Если это только для строк STL, то вы можете сбросить строку вручную. Это очень просто. Единственное небольшое осложнение связано с тем, что строка STL может содержать короткие строки внутри структуры (и более длинные всегда находятся в куче). Строка STL начинается либо с самого укуса (очень короткого), либо с указателя на строку. Эти две команды выведут однобайтовую строку:

da <address>
da poi <address>

Помните, что только одна из команд на самом деле покажет строку - вы обычно можете выяснить это по выводу. Если не уверены, dd <address> + 0x10 l1 - длина строки.

Аналогично для строк широких символов:

du <address>
du poi <address>
1 голос
/ 29 января 2016

Попробуйте команду 'dx', очень хорошо показывает содержимое std :: string для меня

Я думаю, что «dx» является новым в Windows 10

dx (Показать выражение NatVis) https://msdn.microsoft.com/en-us/library/windows/hardware/dn936815(v=vs.85).aspx

1 голос
/ 06 июля 2011

Публичные символы не имеют информации о типе.Вам нужно найти «частные» символы для DLL.Вы также можете использовать свой исполняемый файл / DLL для определения типа.

0 голосов
/ 15 декабря 2017
  1. создать скрипт mystr.txt

    $$ сохранить в файл myStr.txt .if (@@ C ++ ($ {$ arg1} -> _ Mypair._Myval2._Mysize) <16) { da @@ C ++ ($ {$ arg1} -> _ Mypair._Myval2._Bx._Buf) } .else { da @@ C ++ ($ {$ arg1} -> _ Mypair._Myval2._Bx._Ptr) }

2. вызов скрипта с параметром например

$$>a<c:\mystr.txt strVarName
  1. см. Содержимое строки stl.
...