Redirect Gdb打印到文件而不是标准输出

Redirect Gdb打印到文件而不是标准输出,redirect,printing,gdb,Redirect,Printing,Gdb,我正在运行gdb,想检查一个不幸的上帝对象。整个过程需要很多页面(我有一个24英寸的显示器,它是侧着的!)才能看到。为了便于使用,我希望gdb将对象打印到一个文件中,而不是屏幕上,这样我就可以在vi中打开它并轻松地移动。由于gdb的多功能性,一定有办法做到这一点,对吗?您需要启用日志记录 (gdb) set logging on set logging file file 您可以告诉它使用哪个文件 (gdb) set logging file my_god_object.log 您可以检查

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

您需要启用日志记录

(gdb) set logging on
set logging file file
您可以告诉它使用哪个文件

(gdb) set logging file my_god_object.log
您可以检查当前的日志记录配置

(gdb) show logging

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

(gdb) run > outfile

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

gdb command |& tee gdb.log

扩展@qubodup的答案

gdb core.3599 -ex bt -ex quit |& tee backtrace.log
-ex
开关运行一个gdb命令。因此,上面的命令加载核心文件,运行
bt
命令,然后执行
quit
命令。输出写入
backtrace.log
并显示在屏幕上

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

发件人:

您可能希望将gdb命令的输出保存到一个文件中

set logging on
启用日志记录

set logging off
禁用日志记录

(gdb) set logging on
set logging file file
更改当前日志文件的名称。默认日志文件为gdb.txt

set logging overwrite [on|off]
默认情况下,gdb将附加到日志文件中。如果希望将登录设置为覆盖日志文件,请设置覆盖

set logging redirect [on|off]
默认情况下,gdb输出将同时发送到终端和日志文件。如果希望输出只发送到日志文件,请设置重定向

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


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

[niko@my-laptop]# gdb MyBinary 2>&1 log.txt
这是将gdb二进制输出放在同一个log.txt文件中的唯一方法,同时也可以在控制台上看到它

编辑:


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

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

(gdb)set height 0

我在这篇文章中找到了它:

我有一个回溯太长(超过100k行),以至于按住enter键太长。我找到了一个解决方案:

在没有任何用户交互的情况下将回溯写入文件–只需在命令前面加上
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 "$@"

这将是正在调试的程序的输出,而不是gdb本身的输出。OP想记录gdb自己的输出。另请参见:@thepaul,但这实际上非常有用,因为我正在调试一个QT程序,它只是用QDebug垃圾gdb的stdingarbage@rostamn739哦,在某些系统上没有帮助,您需要键入
gdb-c core.3599…
>gdb core.3599-ex'thread apply all bt full'-ex quit Add--batch在没有提示的情况下运行-例如sudo gdb--batch core.3599-ex'thread apply all bt full'-ex quit>output.log如果您希望输出只转到日志文件,请使用
设置日志重定向
。我们不应该设置
设置日志文件my_good\u对象吗。日志
设置登录之前
?这加上
tail-f
awk
今天真的很有帮助。谢谢!无引用的复制粘贴。