WinDBG не отображает строки исходного кода, несмотря на загрузку частные файлы pdb

Я пытаюсь отладить проблему в собственной DLL с помощью WinDBG. Я считаю, что у меня загружены частные символы, но WinDBG не отображает исходные строки или информацию о параметрах. Вот что я наблюдаю; любая помощь будет принята с благодарностью!

У меня есть PDB, который, как мне кажется, соответствует DLL в пути поиска символов. Выполняется лм Я вижу:

01050000 01058000   3NMSMTHR C (private pdb symbols)  e:\ads_symbols\3NMSMTHR.pdb

Поскольку здесь указываются «частные символы pdb», я ожидаю, что это частный pdb.

Я также запустил symchk и увидел следующий результат:

C:\utils\inetmgr\patch01>"c:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" /v 3nmsmthr.dll /s c:\utils\inetmgr\patch01
[SYMCHK] Searching for symbols to C:\utils\inetmgr\patch01\3nmsmthr.dll in path c:\utils\inetmgr\patch01
DBGHELP: Symbol Search Path: c:\utils\inetmgr\patch01
[SYMCHK] Using search path "c:\utils\inetmgr\patch01"
DBGHELP: No header for C:\utils\inetmgr\patch01\3NMSMTHR.DLL.  Searching for image on disk
DBGHELP: C:\utils\inetmgr\patch01\3NMSMTHR.DLL - OK
DBGHELP: 3NMSMTHR - private symbols & lines
     c:\utils\inetmgr\patch01\3NMSMTHR.pdb
[SYMCHK] MODULE64 Info ----------------------
[SYMCHK] Struct size: 1680 bytes
[SYMCHK] Base: 0x10000000
[SYMCHK] Image size: 32768 bytes
[SYMCHK] Date: 0x4cc1b0f8
[SYMCHK] Checksum: 0x00000000
[SYMCHK] NumSyms: 0
[SYMCHK] SymType: SymPDB
[SYMCHK] ModName: 3NMSMTHR
[SYMCHK] ImageName: C:\utils\inetmgr\patch01\3NMSMTHR.DLL
[SYMCHK] LoadedImage: C:\utils\inetmgr\patch01\3NMSMTHR.DLL
[SYMCHK] PDB: "c:\utils\inetmgr\patch01\3NMSMTHR.pdb"
[SYMCHK] CV: RSDS
[SYMCHK] CV DWORD: 0x53445352
[SYMCHK] CV Data:  I:\usr\bpi\adrutl\3NMSMTHR.pdb
[SYMCHK] PDB Sig:  0
[SYMCHK] PDB7 Sig: {A865C40A-5070-4752-AD1F-CD3087843807}
[SYMCHK] Age: 4
[SYMCHK] PDB Matched:  TRUE
[SYMCHK] DBG Matched:  TRUE
[SYMCHK] Line nubmers: TRUE
[SYMCHK] Global syms:  TRUE
[SYMCHK] Type Info:    TRUE
[SYMCHK] ------------------------------------
SymbolCheckVersion  0x00000002
Result              0x001f0001
DbgFilename
DbgTimeDateStamp    0x4cc1b0f8
DbgSizeOfImage      0x00008000
DbgChecksum         0x00000000
PdbFilename         c:\utils\inetmgr\patch01\3NMSMTHR.pdb
PdbSignature        {A865C40A-5070-4752-AD1F-CD3087843807}
PdbDbiAge           0x00000004
[SYMCHK] [ 0x00000000 - 0x001f0001 ] Checked "C:\utils\inetmgr\patch01\3NMSMTHR.DLL"

SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1

Это обнаруживает PDB в правильном пути, который я ему указал ( обратите внимание, что я скопировал этот точный файл PDB в e: \ ads_symbols, который является путем, видимым в выводе lm). В этом выводе symchk указано, что Line Numbers: true, поэтому я ожидаю увидеть информацию частного стиля. Однако, если я запускаю ~ kv , то для моих функций в трассировке стека я вижу:

00bef2ac 01052a8a 00000000 00000000 00020aa4 3NMSMTHR!BPMThrProcTerm+0x2c0
00bef2cc 100073eb 00bef4d8 00000000 00000000 3NMSMTHR!BPMThrThreadInitName+0x2a

И это не похоже на чтение частной информации - я не получаю исходный список вроде Я делаю это для функций MS CRT, которые имеют частные символы на сервере символов MSFT. Также, если я использую x / t / d 3NMSMTHR! ThreadInitName , я получаю

01052a60 <NoType> 3NMSMTHR!BPMThrThreadInitName = <no type information>

И, наконец, если я пытаюсь использовать . frame3 (чтобы перейти к этому кадру), а затем выполнить dv для отображения местных жителей, я получаю:

0:001> .frame
03 00bef2cc 100073eb 3NMSMTHR!BPMThrThreadInitName+0x2a
0:001> dv
Unable to enumerate locals, HRESULT 0x80004005
Private symbols (symbols.pri) are required for locals.
Type ".hh dbgerr005" for details.

Это не имеет для меня смысла. Любая помощь приветствуется. Моя общая цель - получить параметры и исходную информацию. ИЛИ, чтобы подтвердить, что файл PDB, который у меня есть, на самом деле НЕ является личными символами. Я не создавал эту DLL или PDB, и я не знаю каких-либо подробностей о переданных ему параметрах компоновщика.

Спасибо!

РЕДАКТИРОВАТЬ:

Я не упомянул, что получаю ошибку контрольной суммы:

*** WARNING: Unable to verify checksum for C:\utils\inetmgr\3NMSMTHR.dll

Извините! Я пытался запустить команду .lines , как предложено ниже, и вижу:

*** WARNING: Unable to verify checksum for C:\utils\inetmgr\3NMSMTHR.dll
DBGHELP: 3NMSMTHR - private symbols & lines 
    e:\ads_symbols\3NMSMTHR.pdb
Line number information will not be loaded

Так что, думаю, это моя проблема. Это приводит к следующему вопросу: есть ли способ исправить контрольную сумму (которая указана как 0, см. Выше вывод symchk)? Этот PDB является правильным с учетом вывода symchk. Могу я заставить его обойти проверку контрольной суммы?

РЕДАКТИРОВАТЬ2:

Для всех, кто сталкивался с этим: Я смог исправить предупреждение о контрольной сумме:

editbin /release 3NMSMTHR.DLL

Это установило контрольную сумму в заголовке PE. Затем мне пришлось запустить

.symopt+0x40

In WinDbg, чтобы заставить его загрузить PDB, даже если временная метка в DLL была другой. Я уверен, что в качестве альтернативы я мог бы использовать какую-нибудь утилиту для обновления измененной временной метки.

Это исправило предупреждение о контрольной сумме ... но ВСЕ ЕЩЕ нет информации о параметрах (запуск dv в правом кадре), нет источника информация о строке и т. д.

Итак, я потерялся. Возможно ли, что эти PDB не содержат этой информации? Как я мог это подтвердить? Как бы я построил их, чтобы сдержать это? Мы используем NMAKE для их создания.

EDIT3:

Я перестроил DLL и PDB как DEBUG, а затем получил всю ожидаемую информацию трассировки стека. Итак, теперь мой вопрос: (1) можно ли встроить релиз и получить статические функции, информацию о параметрах и т. Д. (Информацию о частных символах)? и (2) трассировка стека, которую я получал с помощью release dlls + pdbs, была неправильной - первая точка входа функции была правильной, но затем следующий кадр стека показал функцию, которая не была вызвана. Я предполагаю, что DLL релиза встроила некоторые функции и каким-то образом PDB просто «угадывала» функцию в этом кадре? Очень странно.

6
задан steve_ash 23 May 2011 в 15:45
поделиться