【发布时间】:2011-08-21 22:05:14
【问题描述】:
我正在运行 GDB,并想检查其中一个不幸的上帝对象。需要很多页(我有一个 24 英寸的显示器横着看!)才能看到整个事情。
为了方便使用,我希望 GDB 将对象打印到文件而不是屏幕上,以便我可以在 vi 中打开它并轻松移动。
凭借 GDB 的所有功能,一定有办法做到这一点,对吧?
【问题讨论】:
我正在运行 GDB,并想检查其中一个不幸的上帝对象。需要很多页(我有一个 24 英寸的显示器横着看!)才能看到整个事情。
为了方便使用,我希望 GDB 将对象打印到文件而不是屏幕上,以便我可以在 vi 中打开它并轻松移动。
凭借 GDB 的所有功能,一定有办法做到这一点,对吧?
【问题讨论】:
您需要启用日志记录:
(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 -f 和awk 真的很有帮助。谢谢!
我发现您可以通过 run 命令将 gdb 的输出重定向到文件:
(gdb) run > outfile
【讨论】:
run &> outfile 有时需要捕获完整的输出。在使用 GoogleTest 时注意到没有添加所有行(除非 stderr 也使用 &> 重定向)
扩展@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 ...
来自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显示日志记录设置的当前值。
【讨论】:
将 gdb 记录到文件同时仍能看到输出(这有助于编写命令)的简单方法是使用 tee:
gdb command |& tee gdb.log
【讨论】:
虽然这里有很多好的答案,但我仍然必须发布唯一对我有用的东西:
[niko@my-laptop]# gdb MyBinary 2>&1 log.txt
这是将 gdb 和二进制输出放入同一个 log.txt 文件的唯一方法,同时还能在控制台上看到它。
编辑:
警告: 输出似乎在 gdb 输出和二进制输出之间部分不同步。有人可以确认吗?您可能需要检查您的 telnet/ssh 客户端是否具有记录您在控制台中看到的输出的功能。
【讨论】:
我有一个很长的回溯(超过 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 "$@"
【讨论】:
您在这里有多个答案。他们是正确的。我只想添加一个命令来帮助您一次收集所有输出。当您收集大量回溯时,这非常有用。在进行任何日志记录配置之前,请执行以下操作:
(gdb)set height 0
【讨论】: