【问题标题】:running gdbserver in background debugging a program and connect to it with gdb from time to time在后台运行 gdbserver 调试程序并不时使用 gdb 连接到它
【发布时间】:2016-06-04 15:28:32
【问题描述】:

我用 C 语言为基于 Debian 的 linux 上的嵌入式设备编写了一个程序。

其中一台设备在运行 8 天后出现分段错误,因此我可以使用 gdb 快速跟踪这不是一个非常常见的错误。

几年前,我知道我使用 gdb(我猜是使用 gdbserver)运行与 shell 分离的程序,这样我就可以让设备继续运行并每天检查是否发生了不好的事情,但我不记得了我是怎么做到的!

我尝试过使用 gdbserver,使用 gdb 连接到它,但是当我关闭连接时它会停止调试。

你知道如何实现吗?

【问题讨论】:

    标签: c linux gdb gdbserver


    【解决方案1】:

    你必须detach,而不是那样退出gdb。

    由于您只是进行验尸,无论如何,我会推荐一些完全不同的东西:

    启用核心转储;以 root 身份运行

     > sudo -s ##become root
     $ echo "*  soft  core  unlimited" >> /etc/security/limits.conf
     $ su -l <user that is running the crashing program>
     $ ulimit -c unlimited
     $ program 
     ##wait for crash
    

    (解除对最大核心转储文件大小的任何限制,包括默认的 0B 限制)。

    然后,在崩溃后,找到core.* coredump 文件,并用gdb 打开它。瞧,崩溃时程序的状态在 gdb 中恢复,您几乎可以做任何在崩溃时附加 gdb 可以做的事情。

    【讨论】:

    • 嗨,Marcus,我尝试了您的解决方案并进行了一些测试,以确认生成了核心转储,但没有生成真实程序的核心转储(这次运行 13 天后出现了段错误)。我认为这是因为它是一个守护进程,当我运行它时,它变得独立于设置 ulimit 参数的用户会话。我试图在 /etc/sysctl.conf 中设置 kernel.core_uses_pid = 1 kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t fs.suid_dumpable = 2 但仍然,如果我注销并再次登录,核心转储功能就会消失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2013-05-15
    • 2014-02-09
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多