gdb - канал вывода внутренней команды в команду оболочки - PullRequest
4 голосов
/ 19 августа 2011

Есть ли способ, как передать вывод внутренней команды gdb какой-то команде оболочки, например grep - вариант [cmd] ! grep в mdb?

Чтобы быть более понятным: в солярисе mdb вы можете, например, написать

main::dis ! grep call

чтобы определить, какие функции вызываются из основного (или grep некоторых имен регистров, чтобы увидеть, как они меняются). Мне интересно, есть ли такая возможность просто в gdb без необходимости перехода с gdb.

Ответы [ 3 ]

4 голосов
/ 16 мая 2018

Семь лет спустя я все еще не нашел собственного способа сделать это, поэтому я написал расширение 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 командам внешней оболочки.

    (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
4 голосов
/ 19 августа 2011

Я не уверен, правильно ли я понял ваш вопрос. Если вы хотите записать в журнал результаты ваших команд 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>
0 голосов
/ 07 января 2012

Введена новая команда GDB, а именно pipe. Если вы хотите обработать вывод команды GDB с помощью некоторой команды оболочки или некоторого сценария, это можно сделать с помощью этой новой команды.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...