Gdb打印到文件而不是stdout

时间:2011-05-09 18:53:40

标签: redirect printing gdb

我正在运行gdb并想要检查其中一个不幸的上帝对象。它需要很多页面(而且我有一个24英寸的显示器转向侧面!)看到整个事情。为了便于使用,我希望gdb将对象打印到文件而不是屏幕,以便我可以打开它vi并轻松地移动。有了所有gdb的多功能性,必须有办法做到这一点,对吗?

8 个答案:

答案 0 :(得分:135)

您需要启用日志记录。

(gdb) set logging on

您可以告诉它使用哪个文件。

(gdb) set logging file my_god_object.log

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

(gdb) show logging

答案 1 :(得分:10)

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

(gdb) run > outfile

答案 2 :(得分:8)

扩展@ qubodup的回答

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

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

另一个有用的gdb调用(给所有线程的局部变量提供stacktrace)是

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

答案 3 :(得分: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
     

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

答案 4 :(得分:2)

将gdb记录到文件中同时仍然看到输出(这样可以简化编写命令)的简单方法是使用tee

gdb command |& tee gdb.log

答案 5 :(得分:1)

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

(gdb)set height 0

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

答案 6 :(得分:0)

尽管这里有很多好的答案,但我仍然必须发布对我有用的唯一内容:

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

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

编辑:

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

答案 7 :(得分:0)

我的回溯很长(超过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 "$@"