gdb-将内部命令的管道输出到shell命令

gdb-将内部命令的管道输出到shell命令,gdb,Gdb,有没有办法将内部gdb命令的输出通过管道传输到一些shell命令,比如grep——这是[cmd]的变体!grep在mdb中 更清楚地说:在solarismdb中,您可以编写 main::dis ! grep call 检测从main调用哪些函数(或grep一些寄存器名以查看它是如何更改的)。我很感兴趣的是,是否有这样的可能性仅在gdb中这样做,而无需从gdb切换。我不确定是否正确理解了您的问题。如果您想记录在调试会话期间运行的GDB命令的结果,那么GDB对此提供了支持 show logging

有没有办法将内部gdb命令的输出通过管道传输到一些shell命令,比如
grep
——这是
[cmd]的变体!grep
mdb

更清楚地说:在solaris
mdb
中,您可以编写

main::dis ! grep call

检测从main调用哪些函数(或grep一些寄存器名以查看它是如何更改的)。我很感兴趣的是,是否有这样的可能性仅在gdb中这样做,而无需从gdb切换。

我不确定是否正确理解了您的问题。如果您想记录在调试会话期间运行的GDB命令的结果,那么GDB对此提供了支持

show logging                    # displays weather logging is on / off
set logging on                  # enable logging
set logging off                 # disable logging
set logging file log-file.txt   # set name for log file, default is gdb.txt
日志文件将在当前目录中生成

此外,您可以使用附加调试会话日志或在每个调试会话上创建新日志

set logging overwrite <on/off>
设置日志覆盖

引入了一个新的GDB命令,即pipe。如果您想使用一些shell命令或脚本来处理GDB命令的输出,可以使用这个新命令来完成


七年后,我仍然没有找到一种本地方法来实现这一点,所以我编写了gdb扩展。为了完整起见,这里复制了它的完整源代码

from __future__ import print_function

import gdb
import string
import subprocess
import sys


class ShellPipe (gdb.Command):
    "Command to pipe gdb internal command output to external commands."

    def __init__(self):
        super (ShellPipe, self).__init__("shell-pipe",
                gdb.COMMAND_DATA,
                gdb.COMPLETE_NONE, True)
        gdb.execute("alias -a sp = shell-pipe", True)

    def invoke(self, arg, from_tty):
        arg = arg.strip()
        if arg == "":
            print("Argument required (gdb_command_and_args | externalcommand..).")
            return

        gdb_command, shell_commands = None, None

        if '|' in arg:
            gdb_command, shell_commands = arg.split("|", maxsplit=1)
            gdb_command, shell_commands = gdb_command.strip(), shell_commands.strip()
        else:
            gdb_command = arg

        # Collect the output and feed it through the pipe
        output = gdb.execute(gdb_command, True, True)
        if shell_commands:
            shell_process = subprocess.Popen(shell_commands, stdin=subprocess.PIPE, shell=True)
            shell_process.communicate(output.encode('utf-8'))
        else:
            sys.stdout.write(output)

ShellPipe()
$HOME/.gdbinit
中寻源
ShellPipeCommand.py
之后,现在可以将内部gdb命令通过管道传输到外部shell命令

    (gdb) shell-pipe disas | grep main
    0x0000000000400527 <+1>:     mov    %rsp,%rbp
    0x000000000040052e <+8>:     movq   $0x4005e4,-0x8(%rbp)
 => 0x0000000000400536 <+16>:    mov    -0x8(%rbp),%rax
    0x000000000040053a <+20>:    mov    %rax,%rdi
(gdb)壳管disas | grep干管
0x0000000000400527:mov%rsp,%rbp
0x000000000040052e:movq$0x4005e4,-0x8(%rbp)
=>0x0000000000400536:mov-0x8(%rbp),%rax
0x000000000040053a:mov%rax,%rdi

谢谢您的回答。日志并不是我要搜索的内容。在Solaris mdb中,可以编写例如“main::dis!”!“grep call”,调试器将对分解结果调用grep。我正在gdb运行grep of dissasemble命令输出中搜索类似的方法(或者将其发送到less)。我可以使用例如objdump和grep的结果,或者从您提到的日志文件中获取输出,但是我很感兴趣的是,是否有办法在gdb中实现这一点。别忘了设置分页。。。。logging/shell命令是目前唯一的方法,例如设置logging on、disas main、设置logging off、shell grep call gdb.txt、有人正在处理管道命令,这可能会使这更直接谢谢您的信息,这正是我所缺少的。希望它能很快成为官方发行版的一部分。也许是时候开始研究Python脚本来定义新命令了::-)我相信这就是您要寻找的,例如,
gdb-p 1234-batch-ex'bt'
打印进程1234的回溯。我对您的脚本进行了一些增强,以允许使用>进行输出重定向。至少在linux中是这样。在arg:中的
if'|'之后,我在arg:
中添加了一个
elif'>',并在
cat>
前面添加了
shell\u命令
变量。