16

我注意到在 GDB 中,当发出类似info variables的长输出命令时,输出一次显示一页,按下enter向下并q退出。

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

4

6 回答 6

9

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

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

除了运行 inside emacs,您还可以使用screenor tmux(学习它们通常会在很多其他情况下帮助您),或者让 GDB 记录输出(set logging on),然后使用您想要gdb.txt的任何内容进行搜索。$PAGER

于 2013-04-21T15:26:35.087 回答
4

gdb在里面运行emacs,你应该能够使用 emacs 的分页命令。

  1. 运行 emacs
  2. 类型M-x gdb返回(M 代表元 - Mac 上的 alt 键或选项)
  3. Emacs 消息栏现在将显示消息: Run gdb (like this): gdb

更多信息可在此处获得:http: //tedlab.mit.edu/~dr/gdbintro.html

高温高压

于 2013-04-21T14:38:36.770 回答
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
...
于 2015-08-06T04:27:01.377 回答
3

Starting with version 9.1, GDB has a pipe command, so you can send a command's output to the pager of your choice. From the documentation:

pipe [command] | shell_command
Executes command and sends its output to shell_command. Note that no space is needed around |. If no command is provided, the last command executed is repeated.

于 2021-03-11T22:27:02.287 回答
2

这是一个有点旧的线程,但我认为值得添加。@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
于 2020-01-05T16:52:45.067 回答
1

In gdb 8.1.1 this code in .gdbinit adds the required functionality:

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

Usage

(gdb) less info breakpoints
(gdb) less backtrace

Information: Commands In Python.

于 2021-03-11T21:28:35.703 回答