GDB在Windows下如何获取回溯信息?

4
使用MinGW GDB版本7.6时,会得到很多这样的回溯信息:
(gdb) bt
#0  0x000000007703d256 in ntdll!RtlEnterCriticalSection ()
   from C:\Windows\SYSTEM32\ntdll.dll
#1  0x0000000000000000 in ?? ()

这并不是很有用。

为什么呢?有没有方法可以获得更有用的信息?当出现错误时,如果我只有这个回溯信息,那就太让人痛苦了,试图弄清一个复杂的多线程程序在出错时正在做什么。


你启用了GDB非停模式吗? 这里有一个很好的使用GDB进行多线程调试的例子:http://blogs.adobe.com/flascc/2012/11/09/debugging-multi-threaded-flascc-applications-with-gdb/ - amdixon
这是32位还是64位应用程序,同样适用于操作系统?由于堆栈包括对ntdll的调用,可以肯定地说这是系统调用的一部分。了解内核调用影响.NET异常的情况,我不会感到惊讶,如果类似的情况也影响回溯。 - Jonathon Reinhart
64位应用程序/64位操作系统。 - Robert Allan Hennigan Leahy
我只是猜测,但我怀疑这是因为GDB无法处理微软的PDB符号格式,因此在Windows系统DLL中除了导出之外,GDB没有符号信息可供处理。 - Michael Burr
2个回答

2

我在使用MinGW 64时遇到了同样的问题。使用编译器开关-g3 -Og最终显示了所有的回溯信息。


1
可能的原因是gdb有一个“当前”线程的概念,这个线程是随机选择的。您可以通过发出gdb命令info threads来查看程序当前正在执行哪些线程。通过thread <num>切换“当前”线程。尝试再次获得有意义的回溯信息。此外,请确保:
  • 使用调试信息(-g)编译您的可执行文件,
  • gdb能够处理用于将调试信息编码到您的可执行文件中的格式。您可能需要验证gdb是否可以在`main()`处设置断点,并且在那里表现得合理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接