有没有办法在 gdb 中对 print 命令的输出进行 grep?就我而言,我正在使用 gdb 调试核心转储,而我正在调试的对象包含大量元素。我发现很难寻找匹配的属性,即:
(gdb) print *this | grep <attribute>
谢谢。
(gdb) 打印 *this | grep
实现这一点的“标准”方法是使用Meta-X gdb
in emacs
。
替代:
(gdb) set logging on
(gdb) print *this
(gdb) set logging off
(gdb) shell grep attribute gdb.txt
cnicutar 提到的补丁确实看起来很有吸引力。我猜它(或它的等价物)从未提交的原因是大多数 GDB 维护者使用emacs
,所以一开始就没有这个问题。
你可以使用pipe
命令
>>> pipe maintenance info sections | grep .text
[15] 0x5555555551c0->0x5555555554d5 at 0x000011c0: .text ...
>>> pipe maintenance info sections | grep .text | wc
1 10 100
最简单的方法是利用 gdb python。单线:
gdb λ py ["attribute" in line and print(line) for line in gdb.execute("p *this", to_string=True).splitlines()]
假设您已启用命令历史记录,您可以只键入一次,然后按Ctrl+R b.exec将其从历史记录中拉出。接下来只需根据您attribute
的*this
要求进行更改。
你也可以像这样简单:
gdb λ grep_cmd "p *this" attribute
为此,只需将以下内容添加到您的.gdbinit
文件中:
py
class GrepCmd (gdb.Command):
"""Execute command, but only show lines matching the pattern
Usage: grep_cmd <cmd> <pattern> """
def __init__ (_):
super ().__init__ ("grep_cmd", gdb.COMMAND_STATUS)
def invoke (_, args_raw, __):
args = gdb.string_to_argv(args_raw)
if len(args) != 2:
print("Wrong parameters number. Usage: grep_cmd <cmd> <pattern>")
else:
for line in gdb.execute(args[0], to_string=True).splitlines():
if args[1] in line:
print(line)
GrepCmd() # required to get it registered
end