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

我正在运行 GDB,想要检查其中一个不幸的上帝对象。它需要很多页(我有一个24英寸的显示器侧翻!)看到整个过程。

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

以广发银行的多功能性,一定有办法做到这一点,对不对?

119791 次浏览

您需要启用日志记录:

(gdb) set logging on

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

(gdb) set logging file my_god_object.log

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

(gdb) show logging

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

(gdb) run > outfile

将 gdb 记录到一个文件,同时仍然可以看到输出(这使得编写命令变得容易)的一个简单方法是使用 tee:

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 core.3599 -ex 'thread apply all bt full' -ex quit

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

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

set logging on

启用日志记录。

set logging off

禁用日志记录。

set logging file file

更改当前日志文件的名称。

set logging overwrite [on|off]

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

set logging redirect [on|off]

默认情况下,gdb 输出将同时发送到终端和日志文件。如果希望只将输出转到日志文件,请设置 redirect。

show logging

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

虽然这里有很多好的答案,但是我还是要把唯一对我有用的东西贴出来:

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

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

编辑:

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

你有很多答案。他们是正确的。我只想添加一个命令,它将帮助您一次收集所有输出。这对你收集大量反向追踪信息很有帮助。在进行任何日志配置之前,请执行以下操作:

(gdb)set height 0

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

我有一个很长的回溯(超过10万行) ,按下回车键花费了太长的时间。我找到了解决办法:

Andreas Schneider 的 bt 命令 在没有任何用户交互的情况下向文件写回溯跟踪——只需在命令的前缀加上 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 "$@"

可以使用 Python 将 Gdb的命令输出重定向到文件(我的 Gdb版本是 8.1.1) :

(gdb) python
>with open("/path/to/file/bt.txt", "w") as outfile:
> outfile.write(gdb.execute("bt", to_string=True))
>end

为了方便起见,这个功能可以作为命令添加到 gdb 中,方法是将其添加到 。 gdbinit中:

python
import argparse


class RedirOutput(gdb.Command):
def __init__(self):
super().__init__("rdr", gdb.COMMAND_USER, gdb.COMPLETE_COMMAND)


def invoke(self, argstr, from_tty):
parser = argparse.ArgumentParser()
parser.add_argument('command', nargs='+')
parser.add_argument('-o', "--outfile", required=True, help="output file")


nm = parser.parse_args(argstr.split())


with open(nm.outfile, "w") as output_file:
try:
output_file.write(gdb.execute(' '.join(nm.command), to_string=True))
except Exception as e:
print(str(e))


RedirOutput()
end

不同用法:

### Inside gdb
(gdb) rdr info -o /absolute/path/info.txt
(gdb) rdr info registers eax -o ./eax.txt
(gdb) rdr bt -o ./bt.txt

注意: 如果在 Vim更少中为了更方便的查看和分页而需要在文件中保存,那么“文件步骤”是多余的,因为 gdb 的输出可以直接重定向到这些程序,请参见 < a href = “ https://stackoverflow. com/a/66590807/2913477”> 重定向到 更少