如何在gdb打印上grep

时间:2013-04-11 22:45:50

标签: debugging unix gdb

有没有办法在gdb中输出print命令的输出?在我的情况下,我正在使用gdb调试核心转储,我正在调试的对象包含很多元素。我发现很难找到匹配的属性,即:

(gdb) print *this | grep <attribute>

感谢。

3 个答案:

答案 0 :(得分:7)

  

(gdb)print * this | grep

实现此目标的“标准”方法是在Meta-X gdb中使用emacs

替代方案:

(gdb) set logging on
(gdb) print *this
(gdb) set logging off
(gdb) shell grep attribute gdb.txt

与上述相比,cnicutar提到的补丁确实看起来很有吸引力。我猜测它(或它的等价物)从未被提交的原因是大多数GDB维护者使用emacs,所以首先没有这个问题。

答案 1 :(得分:0)

最简单的方法是利用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

答案 2 :(得分:0)

您可以使用pipe命令

>>> pipe maintenance info sections | grep .text
 [15]     0x5555555551c0->0x5555555554d5 at 0x000011c0: .text ...

>>> pipe maintenance info sections | grep .text | wc 
      1      10     100