Получение трассировки стека после нарушения прав доступа в Windows - PullRequest
0 голосов
/ 04 декабря 2009

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

[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

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

Ответы [ 2 ]

2 голосов
/ 04 декабря 2009

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

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

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

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

0 голосов
/ 04 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...