在Linux上,我得到了漂亮,健康,完整的堆栈跟踪。然而,在Windows上,当某些东西崩溃时(比如违反段错误),我只得到堆栈的前一行或两行,然后是条目0x0(我无法展开)。这使得调试非常困难
答案 0 :(得分:1)
可能你应该开始使用WinDBG调试你的程序而不是像eclipse这样的IDE。这是非常强大的命令行工具,其功能与GDB非常相似。
在Windows上,当没有定义异常处理程序来处理引发的异常时,将调用“UnhandledExceptionFilter”函数。该函数通常将异常传递给Ntdll.dll文件,该文件捕获并尝试处理它。 EXCEPTION_POINTERS结构确实包含有关异常的最有用信息以及它作为上述函数的参数之一传递的位置。 WinDBG中的 .exr 和 .cxr 命令将使用此信息来获取完整的堆栈跟踪。
typedef struct _EXCEPTION_POINTERS {
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
ExceptionRecord指向EXCEPTION_RECORD结构的指针 包含与机器无关的异常描述。
ContextRecord指向包含a的CONTEXT结构的指针 处理器特定的处理器状态描述 例外的时间。
有关如何从转储文件(如GDB)或调试会话中获取完整的反向跟踪和分析的完整步骤,您可能需要阅读并遵循以下链接中提到的步骤: