在Windows上发生访问冲突后获取堆栈跟踪
我试图在收到SIGSEGV时使用DbgHelp.dll中的StackWalk64函数获取堆栈跟踪,但获取的堆栈跟踪与访问冲突的实际站点无关:在Windows上发生访问冲突后获取堆栈跟踪,windows,stack-trace,Windows,Stack Trace,我试图在收到SIGSEGV时使用DbgHelp.dll中的StackWalk64函数获取堆栈跟踪,但获取的堆栈跟踪与访问冲突的实际站点无关: [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
[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,但我不确定我应该寻找什么。我在这方面没有使用C-runtime支持的windows经验。但是我在使用向量异常处理程序特性方面取得了很大的成功(请参阅)。传递给处理程序的异常指针结构可用于生成用户模式转储文件,您可以使用WinDbg打开该文件以检查异常 注:
-打开转储后需要运行.excr以切换到异常上下文。
-所有异常都会调用向量异常筛选器,因此请确保通过查看传递给筛选器的异常记录::ExceptionCode只筛选出您感兴趣的异常。请注意,在访问冲突后获取可靠的堆栈错误总是很困难的。根据定义,当AV发生时,进程已损坏,因此可能无法检索实际堆栈跟踪后缀(例如,如果导致异常的错误也损坏了堆栈遍历逻辑使用的某些结构,会发生什么情况) 在本例中,您似乎试图在异常筛选器中捕获堆栈跟踪,但该异常筛选器永远不会工作-异常筛选器在部分展开的堆栈上运行。您可以通过API找到故障的异常记录和上下文记录(此API仅从筛选器表达式工作,因此您需要执行以下操作
__try
{
<stuff>
}
__except(MyExceptionFilter(GetExceptionInformation())
{
<stuff>
}
\u试试看
{
}
__Exception(MyExceptionFilter(GetExceptionInformation())
{
}
您应该能够使用上下文记录和异常信息检索准确的堆栈跟踪。是的,我知道我不能保证能够获得完整的堆栈跟踪,但这是关于在系统崩溃时获取尽可能多的信息,因此部分或损坏的堆栈跟踪总比没有好。