【问题标题】:gdb crashes my machine. How to debug?gdb 使我的机器崩溃。如何调试?
【发布时间】:2015-05-01 13:40:24
【问题描述】:

我们正在编写一个相当大的系统,该系统由一组 C++ 程序构建而成。 (大量使用共享库)

当尝试使用 gdb 调试任何程序时,如果您设置断点并且(我猜)程序遇到断点,整个机器将立即崩溃并重新启动。

我不知道从哪里开始。 /var/log/messages 中没有任何内容。 dmesg 只显示机器正在重新启动。

连接的监视器会快速闪烁(我猜)内核恐慌消息,然后它就消失了。甚至无法阅读它是什么。 Centos 6 32 位分发版:

# uname -a
Linux 3.16.6 #1 SMP Fri Oct 31 18:56:38 SGT 2014 i686 i686 i386 GNU/Linux
# gdb --version
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)

我似乎找不到任何日志文件。

怎么办?使用打印语句调试庞大的系统需要很长时间。重建内核?任何程序或建议表示赞赏。

【问题讨论】:

  • 确保您没有硬件问题。而且您可能需要更多 RAM。你不能在 64 位 x86-64 机器上编译和运行吗?顺便说一句,您可以尝试编译更新的 GDB(从源代码),也许是更新的 GCC 和 binutils:当前 GDB 为 7.9,当前 GCC 为 5.1(2015 年 4 月)
  • 感谢您的回复。迁移到 64 位是不可能的——带有 32 位第三方库的庞大代码库。除了 GDB 遇到断点时硬件崩溃之外,硬件没有显示其他问题。我将研究编译一个新的 GDB。大量可用内存:]# cat /proc/meminfo MemTotal: 8066316 kB MemFree: 5789964 kB MemAvailable: 7815828 kB
  • 由于 CentOS 6 带有内核 2.6.32,您正在运行自己的自定义内核,对吗? gdb 的问题是从什么时候开始的?
  • 是的,其中一个人为我们的硬件构建了内核(zotac MB with i7)。 GDB 和断点可以工作——在较小的程序上。但是在“大型应用程序”上打断点会使机器崩溃。包括 ACE/TAO、Agent++ 等外部库,大应用程序约为。 800K 行 C++

标签: linux gdb


【解决方案1】:

如果您遇到内核恐慌,显然您需要在机器重新启动之前捕获输出。有几种方法可以做到这一点:

  1. 将串行线连接到服务器,并让控制台在串行上回显。为此,您需要在引导时在内核命令行上传递 console=ttyS0。或者,

  2. 使用netconsole在网络上发送数据包并从另一台机器监控这些数据包。

还有其他选项也可能有所帮助——请参阅此处了解更多信息:https://wiki.ubuntu.com/Kernel/KernelDebuggingTricks

也就是说,当然,您仍然需要修复任何错误。听起来好像您正在运行自定义内核——您可以采用不同的内核版本(希望修复错误)?

格雷格

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 2014-06-30
    • 1970-01-01
    相关资源
    最近更新 更多