В нем много технических деталей.Я могу дать вам направление.
2-й параметр исключения (0052ccd8
) - это указатель на структуру _s__ThrowInfo
, которая описывает тип сгенерированного типа.Третий параметр (564099d8
) - указатель на брошенный объект.
Сначала давайте обсудим тип брошенного объекта._s__ThrowInfo
указывает на постоянную структуру (генерируемую во время компиляции), которая находится в вашем исполняемом файле (EXE или DLL), который отображается в адресное пространство процесса.
Если включена глобальная памятьв вашем аварийном хранилище - тогда вы можете найти его там.В противном случае вы можете вывести его из исполняемого файла.Вычтите «базовый» адрес из вашего исполняемого файла (при условии, что он был загружен по его предпочтительному адресу), и вы получите смещение этой структуры в вашем исполняемом файле.
Декодирование фактического типа из этой структуры довольно сложно,Он включает информацию о типах, к которым он может быть приведен (полиморфизм C ++), плюс d'tor (деструктор) в случае, если это нетривиальный тип (с нетривиальным d'tor), и он был выброшен по значению.Таблица типов может быть приведена для того, чтобы содержать указатели на соответствующие структуры, описывающие эти типы.Среди прочего есть текстовые «кодировки» этих типов.
Информацию о расположении этих структур можно найти здесь :
Далее брошенный объект.Его адрес обычно принадлежит стековой памяти (строго говоря, это не обязательно, можно бросить либо глобальный, либо динамически размещаемый (в куче) объект. Но обычно это не так).Если у вас есть стек, включенный в ваш аварийный дамп - вы увидите макет объекта.В сочетании с типом вы (надеюсь) поймете, что это значит.
Если у вас нет стековой памяти, включенной в ваш аварийный дамп - вы не сможете восстановить объект.
Кроме того, ваш объект может содержать члены, которые указывают на другие вещи (например, строки или другие объекты), которые не обязательно размещаются в стеке.Скорее всего, вам не удастся реализовать этих членов, если у вас нет дампа полной памяти.