Декодирование параметров генерируемого исключения С++ (0xE06D7363)

У меня есть файл аварийного дампа (мое 32-битное приложение Windows разбилось на клиентском компьютере). Код исключения - 0xE06D7363. Итак, я нашел эту статью из блогов MSDN об декодировании параметров исключения. Но рецепт статьи не работает для меня:

0:000> .exr -1 
ExceptionAddress: 753ad36f (KERNELBASE!RaiseException+0x00000058)
   ExceptionCode: e06d7363 (C++ EH exception)
  ExceptionFlags: 00000001
NumberParameters: 3
   Parameter[0]: 19930520
   Parameter[1]: 0052ccd8
   Parameter[2]: 564099d8
0:000> dd 564099d8 l4
564099d8  00000000 00000000 00000000 564099d0
0:000> dd 564099d0 l2
564099d0  00000001 564099b4
0:000> dd 564099b4 l2
564099b4  00000001 56454aec
0:000> da 56454aec+8
56454af4  "????????????????????????????????"
56454b14  "????????????????????????????????"
56454b34  "????????????????????????????????"
56454b54  "????????????????????????????????"
56454b74  "????????????????????????????????"
56454b94  "????????????????????????????????"
56454bb4  "????????????????????????????????"
56454bd4  "????????????????????????????????"
56454bf4  "????????????????????????????????"
56454c14  "????????????????????????????????"
56454c34  "????????????????????????????????"
56454c54  "????????????????????????????????"

Как я могу заставить этот метод работать? Или, может быть, есть другие способы анализа аварийного дампа с этим исключением?

Ниже приведена информация из !analyze -v:

PROCESS_NAME:  ArcMap.exe
MODULE_NAME: arcmap
FAULTING_MODULE: 76fa0000 ntdll
DEBUG_FLR_IMAGE_TIMESTAMP:  4e793643
ERROR_CODE: (NTSTATUS) 0xe06d7363 - <Unable to get error code text>
EXCEPTION_CODE: (NTSTATUS) 0xe06d7363 - <Unable to get error code text>
EXCEPTION_PARAMETER1:  19930520
EXCEPTION_PARAMETER2:  0052ccd8
EXCEPTION_PARAMETER3:  564099d8

Ответ 1

Есть много технических деталей. Я могу дать вам направление.

Второй параметр исключения (0052ccd8) является указателем на структуру _s__ThrowInfo, которая описывает брошенный тип. Третий параметр (564099d8) является указателем на заброшенный объект.

Сначала обсудим тип брошенного объекта. _s__ThrowInfo указывает на постоянную структуру (сгенерированную во время компиляции), которая находится внутри исполняемого файла (EXE или DLL), который отображается в адресное пространство процесса.

Если глобальная память включена в ваш аварийный дамп, вы можете найти ее там. В противном случае вы можете вывести его из исполняемого файла. Вычтите "базовый" адрес из вашего исполняемого файла (при условии, что он был загружен по его предпочтительному адресу), и вы получите смещение этой структуры в своем исполняемом файле.

Декодирование фактического типа из этой структуры является довольно сложным. Он включает в себя информацию о типах, к которым он может быть применен (полиморфизм С++), а также дентер (деструктор) в случае, если он нетривиальный тип (с нетривиальным d'tor), и он был сброшен по значению. Таблицу типов, которые он может отличать, содержит указатели на соответствующие структуры, описывающие эти типы. Среди прочего есть текстовые "кодировки" этих типов.

Информация о компоновке этих структур может быть найдена здесь:

Затем, заброшенный объект. Его адрес обычно принадлежит памяти стека (строго говоря, это необязательно, можно выбросить либо глобальный, либо динамически распределенный (на кучу) объект, но это обычно не так). Если у вас есть стек, включенный в ваш дамп сбоя - вы увидите макет объекта. В сочетании с типом, который вы (надеюсь) понимаете, что это значит.

Если у вас нет памяти стека, включенной в ваш аварийный дамп, вы не сможете восстановить объект.

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

Ответ 2

старый вопрос и очень поздний ответ (вопрос появился в активном списке, так что ответ)

суть raymond chen и valdos отвечают в консульстве script

0:000> dt _s_throwinfo pCatchableTypeArray[0]->arrayOfCatchableTypes->pType->name  @@c++(( (ntdll!_EXCEPTION_RECORD *) @@masm(@esp+4) )->ExceptionInformation[2])
cppexept!_s_ThrowInfo
   +0x00c pCatchableTypeArray                                        : [0] 
      +0x004 arrayOfCatchableTypes                                      : [0] 
         +0x004 pType                                                      : 
            +0x008 name                                                       : [0]  ".PAD"