> Я иногда пользовался (главное знать, где какой регистр :). Правда
> дампу этому требуется
> апгрейд для поддержки x64, т.к. там уже точно левые числа печатаются.
> Видимо на
> x64 структура записи контекста процессора иная.
У меня с недавних пор стоит WinXP x64. Всё работает замечательно кроме
распечатки стека возвратов. Пример :
3 0 /
EXCEPTION! CODE:C0000094 ADDRESS:5928FA WORD:/ REGISTERS:
12ED6C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
12ED7C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
12ED8C 00 00 00 00 00 00 00 00 00 00 00 00 2B 00 00 00 ............+...
USER DATA: 441E94 THREAD ID: BF0 HANDLER: 12EFE8 RETURN STACK:
0 : 4 : 8 : C : 10 : 14 : 18 : 1C : 20 : 24 : 28 : 2C : 30 : 34 : 38 : 3C : 40 : 44 : 48 : 4C :
50 : 54 : 58 : 5C : 60 : END OF EXCEPTION REPORT
3 0 /
^ 0xC0000094L INTEGER_DIVIDE_BY_ZERO
Стал разбираться. Причина - магическое число 176 в EXC-DUMP. При исключении
обработчик (EXC) получает четыре параметра на стеке. В <EXC-DUMP> передаётся только
один - ExceptionRecord. В <EXC-DUMP> от этой структуры делается 176 + и ожидается попадание
на структуру _CONTEXT, что в Win32 видимо так и было. Под WOW64 этот номер не проходит. Решение -
явно передать параметр ExceptionContext из обработчика в EXC-DUMP. После этого всё замечательно
работает :
3 0 /
EXCEPTION! CODE:C0000094 ADDRESS:5928FA WORD:/ REGISTERS:
12EDA8 94 1E 44 00 ED 28 59 00 01 00 00 00 00 00 00 00 Ф.D.э(Y.........
12EDB8 00 00 00 00 03 00 00 00 C0 FF 12 00 FA 28 59 00 ........└ ..·(Y.
12EDC8 23 00 00 00 86 02 01 00 D8 EF 12 00 2B 00 00 00 #...Ж...╪я..+...
USER DATA: 441E94 THREAD ID: D10 HANDLER: 12EFE8 RETURN STACK:
12EFD8 : 5A563B INTERPRET_
12EFDC : 5A56C2 INTERPRET
12EFE0 : 5A5914 MAIN1
12EFE4 : 594FE0 CATCH
12EFE8 : 12EFF8 <not found>
END OF EXCEPTION REPORT
3 0 /
^ 0xC0000094L INTEGER_DIVIDE_BY_ZERO
Итого. В EXC-DUMP надо передавать два параметра. Для совместимости это плохо. Надо
переназвать слово... Можно ещё попробовать разделить - два вектора - один обрабатывает
EXCEPTION_RECORD, а другой _CONTEXT (первый печатает только верхнюю строчку, а второй -
дамп регистров и стека) - но там надо что-то делать с флагом IN-EXCEPTION.
В аттаче код - слова EXC-DUMP1 и (EXC). Проверял на WinXP x64, Win2k, Win98
--
ygrek