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