Re[16]: Дамп стека при возникновении исключения
От: lav03  
Дата: 28.11.03 18:00
Оценка:
Спасибо. В работает. Но есть одна странность. Возьмем код, где 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() должен быть в стеке

Александр
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.