我注意到在GDB中,当发出像info variables
这样的长输出的命令时,输出会一次显示一页,按enter
向下并q
退出。< / p>
是否可以将默认寻呼机替换为另一个,例如less
,以便我可以上下导航,退出,搜索等?
答案 0 :(得分:8)
是否可以将默认寻呼机替换为另一个
否:GDB不会调用外部程序来显示输出,它只是暂停输出每个屏幕(并且你可以让它不会被set height 0
暂停)。
除了在emacs
内部运行之外,你还可以使用screen
或tmux
(学习它们通常会在很多其他情况下帮助你),或者让GDB记录输出(set logging on
),然后使用您想要的任何gdb.txt
在$PAGER
中搜索。
答案 1 :(得分:4)
您可以将以下用户定义的命令放在〜/ .gdbinit中,然后
% cat ~/.gdbinit
python import os
define less1
python os.popen("less","w").write(gdb.execute("$arg0",to_string=True))
end
define less2
python os.popen("less","w").write(gdb.execute("$arg0 $arg1",to_string=True))
end
...
% gdb
(gdb) less2 info var
...
(gdb) less1 disass
...
答案 2 :(得分:3)
在gdb
内运行emacs
,您应该可以使用emacs的分页命令。
M-x gdb
返回(M代表元 - alt键或Mac上的选项)Run gdb (like this): gdb
此处提供了更多信息:http://tedlab.mit.edu/~dr/gdbintro.html
HTH
答案 3 :(得分:2)
从 9.1 版开始,GDB 有一个 pipe
命令,因此您可以将命令的输出发送到您选择的寻呼机。来自documentation:
管道 [命令] | shell_command
执行 command 并将其输出发送到 shell_command。请注意,|
周围不需要空格。如果没有提供command,则重复执行最后一个命令。
答案 4 :(得分:1)
在 gdb 8.1.1 中,.gdbinit
中的这段代码添加了所需的功能:
python
import os
class Less(gdb.Command):
def __init__(self):
super().__init__("less", gdb.COMMAND_USER, gdb.COMPLETE_COMMAND)
def invoke(self, argstr, from_tty):
with os.popen("less","w") as pipe:
try:
pipe.write(gdb.execute(argstr, to_string=True))
except Exception as e:
pipe.write(str(e))
Less()
end
使用
(gdb) less info breakpoints
(gdb) less backtrace
信息: Commands In Python.
答案 5 :(得分:0)
这是一个有点旧的线程,但是我认为值得补充。 @yichun在这里给出了一个很好的主意,但为了更实际,可以将其扩展为任意数量的参数:
define less
python import os
python os.popen("less","w").write(gdb.execute(' '.join(["$arg{0}".format(i) for i in range(0, argc)]), to_string=True))
end
然后它还可以添加异常处理并等待进程终止以避免键盘故障,我们有类似的东西:
% cat ~/.gdbinit
define less
python argc = $argc
python
import os
f = None
try:
f = os.popen("less","w")
f.write(gdb.execute(' '.join(["$arg{0}".format(i) for i in range(0, argc)]), to_string=True))
except Exception as e:
if f:
f.write(str(e))
else:
print (str(e))
finally:
if f:
f.close()
end
end