Расшифровка параметров сгенерированного исключения C ++ (0xE06D7363) - PullRequest
11 голосов
/ 01 февраля 2012

У меня есть файл аварийного дампа (мое 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

Ответы [ 2 ]

13 голосов
/ 01 февраля 2012

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

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

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

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

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

Информацию о расположении этих структур можно найти здесь :

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

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

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

2 голосов
/ 15 июля 2015

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

Суть Раймонда Чена и Вальдоса в письменной форме ответа

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"
...