Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows上发生访问冲突后获取堆栈跟踪_Windows_Stack Trace - Fatal编程技术网

在Windows上发生访问冲突后获取堆栈跟踪

在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

我试图在收到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_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())
{
}

您应该能够使用上下文记录和异常信息检索准确的堆栈跟踪。

是的,我知道我不能保证能够获得完整的堆栈跟踪,但这是关于在系统崩溃时获取尽可能多的信息,因此部分或损坏的堆栈跟踪总比没有好。