【问题标题】:GDB print to file instead of stdoutGDB 打印到文件而不是标准输出
【发布时间】:2011-08-21 22:05:14
【问题描述】:

我正在运行 GDB,并想检查其中一个不幸的上帝对象。需要很多页(我有一个 24 英寸的显示器横着看!)才能看到整个事情。

为了方便使用,我希望 GDB 将对象打印到文件而不是屏幕上,以便我可以在 vi 中打开它并轻松移动。

凭借 GDB 的所有功能,一定有办法做到这一点,对吧?

【问题讨论】:

    标签: redirect printing gdb


    【解决方案1】:

    您需要启用日志记录:

    (gdb) set logging on
    

    现在 GDB 将登录到./gdb.txt。你可以告诉它使用哪个文件:

    (gdb) set logging file my_god_object.log
    

    您可以检查当前的日志记录配置:

    (gdb) show logging
    

    【讨论】:

    • 如果您希望输出到日志文件,请使用set logging redirect on
    • 我们不应该在set logging on之前设置set logging file my_god_object.log吗?
    • 今天加上tail -fawk 真的很有帮助。谢谢!
    【解决方案2】:

    我发现您可以通过 run 命令将 gdb 的输出重定向到文件:

    (gdb) run > outfile
    

    【讨论】:

    • 那将是被调试程序的输出,而不是 gdb 本身的输出。 OP 想要记录 gdb 自己的输出。
    • @thepaul 但这实际上非常有用,因为我正在调试一个 QT 程序,它只是用它的 QDebug 垃圾来破坏 gdb 的标准输入
    • @rostamn739 哎呀,一点帮助都没有
    • run &> outfile 有时需要捕获完整的输出。在使用 GoogleTest 时注意到没有添加所有行(除非 stderr 也使用 &> 重定向)
    【解决方案3】:

    扩展@qubodup 的回答

    gdb core.3599 -ex bt -ex quit |& tee backtrace.log
    

    -ex 开关运行 gdb 命令。所以上面加载了核心文件,运行bt命令,然后quit命令。输出将写入backtrace.log 以及屏幕上。

    另一个有用的 gdb 调用(使用来自所有线程的局部变量提供堆栈跟踪)是

    gdb core.3599 -ex 'thread apply all bt full' -ex quit
    

    【讨论】:

    • 在某些系统上,您需要输入gdb -c core.3599 ...
    • > gdb core.3599 -ex 'thread apply all bt full' -ex quit 添加 --batch 以在没有提示的情况下运行 -eg sudo gdb --batch core.3599 -ex 'thread apply all bt full' -ex quit > output.log
    【解决方案4】:

    来自https://sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html

    您可能希望将 gdb 命令的输出保存到文件中。有几个命令可以控制 gdb 的日志记录。

    set logging on
    

    启用日志记录。

    set logging off
    

    禁用日志记录。

    set logging file file
    

    更改当前日志文件的名称。默认日志文件是 gdb.txt。

    set logging overwrite [on|off]
    

    默认情况下,gdb 将追加到日志文件中。如果您希望设置登录以覆盖日志文件,请设置覆盖。

    set logging redirect [on|off]
    

    默认情况下,gdb 输出将同时发送到终端和日志文件。如果您希望输出仅发送到日志文件,请设置重定向。

    show logging
    

    显示日志记录设置的当前值。

    【讨论】:

    【解决方案5】:

    将 gdb 记录到文件同时仍能看到输出(这有助于编写命令)的简单方法是使用 tee

    gdb command |& tee gdb.log
    

    【讨论】:

      【解决方案6】:

      虽然这里有很多好的答案,但我仍然必须发布唯一对我有用的东西:

      [niko@my-laptop]# gdb MyBinary 2>&1 log.txt
      

      这是将 gdb 二进制输出放入同一个 log.txt 文件的唯一方法,同时还能在控制台上看到它。

      编辑:

      警告: 输出似乎在 gdb 输出和二进制输出之间部分不同步。有人可以确认吗?您可能需要检查您的 telnet/ssh 客户端是否具有记录您在控制台中看到的输出的功能。

      【讨论】:

        【解决方案7】:

        我有一个很长的回溯(超过 10 万行),以至于按住 Enter 键的时间太长了。我找到了解决方案:

        Andreas Schneider's bt command 无需任何用户交互即可将回溯写入文件 - 只需在您的命令前加上 bt

        这里,我把它变成了一个脚本:

        #!/usr/bin/env bash
        ex=(
            -ex "run"
            -ex "set logging overwrite on" 
            -ex "set logging file gdb.bt" 
            -ex "set logging on" 
            -ex "set pagination off"
            -ex "handle SIG33 pass nostop noprint"
            -ex "echo backtrace:\n"
            -ex "backtrace full"
            -ex "echo \n\nregisters:\n"
            -ex "info registers"
            -ex "echo \n\ncurrent instructions:\n"
            -ex "x/16i \$pc"
            -ex "echo \n\nthreads backtrace:\n"
            -ex "thread apply all backtrace"
            -ex "set logging off"
            -ex "quit"
        )
        echo 0 | gdb -batch-silent "${ex[@]}" --args "$@"
        

        【讨论】:

          【解决方案8】:

          您在这里有多个答案。他们是正确的。我只想添加一个命令来帮助您一次收集所有输出。当您收集大量回溯时,这非常有用。在进行任何日志记录配置之前,请执行以下操作:

          (gdb)set height 0
          

          我在这篇文章中找到了它:https://askaralikhan.blogspot.com/2016/05/gdb-all-threads-bt-to-file.html?showComment=1584614942454#c4584028195226351332

          【讨论】:

            最近更新 更多