有没有办法如何将内部gdb命令的输出传递给某些shell命令,如grep
- [cmd] ! grep
中mdb
的变体?
更明确一点:在solaris mdb
中你可以例如写
main::dis ! grep call
检测从main调用哪些函数(或grep某些寄存器名称以查看它是如何更改的)。我感兴趣的是,如果有可能只在gdb中这样做,而无需从gdb切换。
答案 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命令的输出,可以使用此新命令完成。