WinDBG показывает неполный стек

Я получил сложный аварийный дамп: (32-битная) программа (C++) была написана в Visual Studio 6 и выполнена на 64-битной машине. Итак, я получил 64-битный аварийный дамп. К сожалению, у меня нет доступа к VS 6 (и я не думаю, что VS6 может обрабатывать 64-битные версии). VS 2015 не может открыть этот аварийный дамп (32-битный отладчик не может отлаживать 64-битный...), поэтому я попробовал его с помощью WinDBG (и моего собственного средства просмотра файлов dmp :).

Просмотр стека показывает только системные адреса (0x7..).

Eg.:

 .  0  Id: bdc.b40 Suspend: 0 Teb: 00000000`7efdb000 Unfrozen
        Start: XXXX+0x4bf33d (00000000`008bf33d)
        Priority: 2  Priority class: 128  Affinity: f
   # Child-SP          RetAddr           Call Site
  00 00000000`0008e2e8 00000000`73deaedc wow64win!NtUserGetMessage+0xa
  01 00000000`0008e2f0 00000000`73e3d18f wow64win!whNtUserGetMessage+0x30
  02 00000000`0008e350 00000000`73dc2776 wow64!Wow64SystemServiceEx+0xd7
  03 00000000`0008ec10 00000000`73e3d286 wow64cpu!ServiceNoTurbo+0x2d
  04 00000000`0008ecd0 00000000`73e3c69e wow64!RunCpuSimulation+0xa
  05 00000000`0008ed20 00000000`77c7fb96 wow64!Wow64LdrpInitialize+0x42a
  06 00000000`0008f270 00000000`77cdbd09 ntdll!LdrpInitializeProcess+0x17e3
  07 00000000`0008f760 00000000`77c6a36e ntdll! ?? ::FNODOBFM::`string'+0x22a30
  08 00000000`0008f7d0 00000000`00000000 ntdll!LdrInitializeThunk+0xe

Нет даже точки входа, как указано выше, в ThreadInfoListStream или

0:000> ~*
.  0  Id: bdc.b40 Suspend: 0 Teb: 00000000`7efdb000 Unfrozen
      Start: XXXX+0x4bf33d (00000000`008bf33d)
      Priority: 2  Priority class: 128  Affinity: f
[..]

Что не так/где я не прав? Что я могу сделать, чтобы увидеть весь стек? Есть ли где-нибудь помощь/гайд, как раскрутить стек самостоятельно (я умею загружать/читать pdbs, имею доступ к сохранённой в дампе памяти, уже раскодировал основную часть ТЭБ, . ..).

Спасибо


person Ralph Erdt    schedule 12.07.2017    source источник


Ответы (1)


Команду .effmach можно использовать для переключения между архитектурами. Он принимает x86 или amd64 в качестве аргумента.

Вы также можете загрузить расширение wow64exts. У него есть команда !sw, которая переключает два режима.

Обратите внимание, как меняется командная строка и вывод k:

0:000> k
Child-SP          RetAddr           Call Site
00000000`006ee8e8 00000000`60db21ef wow64cpu!CpupSyscallStub+0xc
00000000`006ee8f0 00000000`60e5bfa1 wow64cpu!Thunk0Arg+0x5
00000000`006ee9a0 00000000`60e4cbb0 wow64!RunCpuSimulation+0xf311
00000000`006eea20 00007ff9`0bef2a11 wow64!Wow64LdrpInitialize+0x120
00000000`006eecd0 00007ff9`0bf289c6 ntdll!EtwEventProviderEnabled+0x1cb1
00000000`006ef0d0 00007ff9`0bed9fae ntdll!memset+0x1c006
00000000`006ef150 00000000`00000000 ntdll!LdrInitializeThunk+0xe

0:000> .load wow64exts
0:000> !sw
Switched to 32bit mode

0:000:x86> k
ChildEBP RetAddr  
007eeebc 09ad86fe win32u!NtUserWaitMessage+0xc
WARNING: Frame IP not in any known module. Following frames may be wrong.
007eefd8 7303eaf6 0x9ad86fe
007eefe4 730470e9 clr!CallDescrWorkerInternal+0x34
007ef038 73047714 clr!CallDescrWorkerWithHandler+0x6b
007ef0a0 731dac11 clr!MethodDescCallSite::CallTargetWorker+0x16a
007ef1cc 731dad09 clr!RunMain+0x1ad
person Thomas Weller    schedule 12.07.2017