Спасибо. В работает. Но есть одна странность. Возьмем код, где CStructuredException — моя обетртка для SE (как учит Рихтер).
void CErrHndlTestDlg::OnBnClickedButton1()
{
try{
int res = foo();
}
catch(CMemoryException e) {...}
catch(CStructuredException e) {...}
}
int foo()
{
try{
CString* s;
s->SetAt(3, '9'); // ACCESS VIOLATION
}
catch(CMemoryException e) {...}
catch(CStructuredException e) {...}
return 0;
}
В моем обработчике SE вызывается IntelStackWalk(pExceptionInfo->ContextRecord),
где pExceptionInfo — это e.m_ExceptionRecord (не буду писать подробно). В общем, e.m_ExceptionRecord инициализируется в конструкторе CStructuredException. Все, как у Рихтера.
IntelStackWalk выдает прекрасный дамп, где самая первая строчка — адрес (естест-но со смещением) ф-ции
CSimpleString.SetAt(..);
Затемм идет адрес foo(), а потом OnBnClickedButton1().
Я об этом и мечтал!!!
Но если я изменю код:
void CErrHndlTestDlg::OnBnClickedButton1()
{
try{
int res = foo();
}
catch(CMemoryException e) {...}
catch(CStructuredException e) {...}
}
int foo()
{
try{
throw new CMemoryException; // С++ исключение
}
catch(CMemoryException e) {...}
catch(CStructuredException e) {...}
return 0;
}
и в обработчике для CMemoryException получу контекст-рекорд
CONTEXT Context;
Context.ContextFlags = CONTEXT_FULL;
GetThreadContext(m_hThread, &Context);
IntelStackWalk(&Context);
первый адрес в дампе получаю какой — то бещеный:
Address Frame Logical addr Module
7FFE0304 0012FA14 0000:00000000
а следующий адрес указывает даже не на мою foo(), а на OnBnClickedButton1().
Такое ощущение, что фрейм не формируется.
Делел в VC++7. Опцию /Oy отключил.
Не пойму разницы. По крайней мере адрес возврата из foo() должен быть в стеке
Александр