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

时间:2011-08-19 11:06:26

标签: gdb

有没有办法如何将内部gdb命令的输出传递给某些shell命令,如grep - [cmd] ! grepmdb的变体?

更明确一点:在solaris mdb中你可以例如写

main::dis ! grep call

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

3 个答案:

答案 0 :(得分:4)

我不确定我是否正确理解了你的问题。如果您想要在调试会话期间运行的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>

答案 1 :(得分:4)

七年后,我仍然没有找到本地方法来做这件事,所以我写了shell-pipe 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()

ShellPipeCommand.py中获取$HOME/.gdbinit之后,现在可以将内部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

答案 2 :(得分:-1)

引入了一个新的GDB命令,即管道。如果要使用某些shell命令或某些脚本处理GDB命令的输出,可以使用此新命令完成。

http://www.gdbenhanced.freewebsitehosting.com/