2009-12-04 5 views
0

Я пытаюсь использовать функцию StackWalk64 в DbgHelp.dll, чтобы получить трассировку стека при получении SIGSEGV, но полученная трассировка стека не связана с фактическим сайтом доступа нарушение:Получение трассировки стека после нарушения прав доступа в Windows

[0] sigsegv_handler() e:\hudson\jobs\ide-nightly-trunk\workspace\ide-nightly-trunk\core\ide\cspyserver\src\stackwalker\cssstackwalker.cpp:31 
[1] XcptFilter() C:\Windows\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2\MSVCR90.dll 
[2] __tmainCRTStartup() f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c:603 
[3] seh_longjmp_unwind4() C:\Windows\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.4148_none_5090ab56bcba71c2\MSVCR90.dll 
[4] BaseThreadInitThunk() C:\Windows\syswow64\kernel32.dll 
[5] RtlCreateUserProcess() C:\Windows\SysWOW64\ntdll.dll 
[6] RtlCreateProcessParameters() C:\Windows\SysWOW64\ntdll.dll 

Я подозреваю, что обработка странных окон исключения и setjmp/longjmp участвуют, но я не совсем уверен, что я должен искать.

ответ

2

Обратите внимание: при нарушении прав доступа всегда будет сложно получить надежную ошибку стека. По определению процесс является коррумпированным, когда AV возникает, поэтому может быть невозможно получить фактические тайны следа стека (например, что произойдет, если ошибка, вызвавшая это исключение, также исказила некоторые структуры, используемые вашей логикой стека)?

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

__try 
    { 
    <stuff> 
    } 
    __except(MyExceptionFilter(GetExceptionInformation()) 
    { 
    <stuff> 
    } 

Вы должны быть в состоянии получить точную трассировку стеки с записью контекста и информацией об исключении.

+0

Да, я знаю, что у меня нет никаких гарантий, что я могу получить полную стеклу, но это касается получения информации о том, когда система разбилась, поэтому частичная или сломанная stacktrace лучше, чем ничего. – JesperE

0

У меня нет опыта работы в Windows с использованием поддержки C-runtime в этой области. Но у меня был хороший успех, используя функцию векторного обработчика исключений (см. MSDN AddVectoredExceptionHandler). Структура EXCEPTION_POINTERS, переданная обработчику, может использоваться с MiniDumpWriteDump API для создания файла дампа пользовательского режима, который можно открыть с помощью WinDbg для проверки исключения.

Примечания:
- вам нужно запустить .excr после открытия дампа, чтобы перейти в контекст исключения.
- Векторные фильтры исключений вызывают для все исключения, поэтому не забудьте отфильтровать только те, которые вас интересуют, посмотрев на EXCEPTION_RECORD :: ExceptionCode, переданный фильтру.

Смежные вопросы