【问题标题】:GDB Windows ?? in BacktracesGDB 窗口 ??在回溯中
【发布时间】:2013-11-15 08:05:34
【问题描述】:

使用 MinGW GDB 7.6 版,得到很多这样的回溯:

(gdb) bt
#0  0x000000007703d256 in ntdll!RtlEnterCriticalSection ()
   from C:\Windows\SYSTEM32\ntdll.dll
#1  0x0000000000000000 in ?? ()

这并不完全有用。

这是为什么?反正有什么更有用的吗?当 this 是我得到的回溯时发生错误时,尝试弄清楚一个复杂的多线程程序在做什么绝对是痛苦的。

【问题讨论】:

  • 你开启gdb不间断模式了吗?有一个很好的 gdb 多线程调试示例here
  • 这是一个 32 或 64 的应用程序,同样适用于操作系统?此外,由于堆栈包含对ntdll 的调用,因此可以肯定地说这是系统调用的一部分。了解我对影响 .NET 异常的内核调用的了解后,如果此处类似的东西影响回溯,我不会感到惊讶。
  • 64 位应用程序/64 位操作系统。
  • 我只是猜测,但我怀疑这是因为 GDB 不处理 Microsoft 的 PDB 符号格式,因此 GDB 在 Window 的系统 DLL 中除了导出之外没有符号信息可供处理。

标签: c++ c windows gdb mingw


【解决方案1】:

我在使用 MinGW 64 时遇到了同样的问题。使用编译器开关 -g3 -Og 终于很好地展示了所有的回溯。

【讨论】:

    【解决方案2】:

    原因可能是 gdb 有一个“当前”线程的概念,恕我直言,它是随机选择的。

    您可以通过发出 gdb 命令info threads 查看您的程序当前正在执行哪些线程。 通过thread <num> 切换“当前”线程。 尝试再次获得有意义的回溯。

    还要确保

    • 您的可执行文件已使用调试信息 (-g) 进行编译,
    • gdb 能够处理用于将调试信息编码到可执行文件中的格式。您可能想验证 gdb 是否可以在 `main()' 处设置断点,并且在那里的行为是否合理。

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2017-12-07
      • 1970-01-01
      相关资源
      最近更新 更多