使用less作为gdb寻呼机

时间:2013-04-21 14:25:48

标签: gdb

我注意到在GDB中,当发出像info variables这样的长输出的命令时,输出会一次显示一页,按enter向下并q退出。< / p>

是否可以将默认寻呼机替换为另一个,例如less,以便我可以上下导航,退出,搜索等?

6 个答案:

答案 0 :(得分:8)

  

是否可以将默认寻呼机替换为另一个

否:GDB不会调用外部程序来显示输出,它只是暂停输出每个屏幕(并且你可以让它不会被set height 0暂停)。

除了在emacs内部运行之外,你还可以使用screentmux(学习它们通常会在很多其他情况下帮助你),或者让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的分页命令。

  1. 运行emacs
  2. 类型M-x gdb返回(M代表元 - alt键或Mac上的选项)
  3. Emacs消息栏现在将显示消息: Run gdb (like this): gdb
  4. 此处提供了更多信息: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