gdb python disas-解析输出

时间:2019-04-11 09:36:31

标签: gdb-python

设置:GDB使用脚本运行内部python解释器。脚本的内容在某些内存上运行disas

我需要此命令在python字符串中的输出。我该怎么做?

关于日志记录的想法,但结果是仅记录了命令的第一行:

Dump of assembler code from 0x8000 to 0x8030:

该疾病的预期结果在屏幕上,但不在日志文件中。

0x00008000: fsw fa0,24(a5)
0x00008002: fsd fs6,16(sp)
0x00008004: addi    s1,sp,920
...

是否可以将stdout重定向到流中或以其他方式获取信息?

编辑:我已将GDB连接到openOCD服务器。我的目标是汇编程序命令。没有小精灵文件矿,我从中获取源代码。仅仅是控制器程序存储器中的纯机器指令,我需要打印出来。

1 个答案:

答案 0 :(得分:1)

disassemble的输出转换为字符串的最简单方法是给gdb.execute一个to_string=True参数。

(gdb) start
...
(gdb) pi
>>> import pprint
>>> pp=pprint.PrettyPrinter()
>>> pp.pprint(gdb.execute("disassemble main",to_string=True))
('Dump of assembler code for function main:\n'
 '   0x00005555555546a4 <+0>:\tpush   %rbp\n'
 '   0x00005555555546a5 <+1>:\tmov    %rsp,%rbp\n'
 '=> 0x00005555555546a8 <+4>:\tcallq  0x555555554560 <pause@plt>\n'
 '   0x00005555555546ad <+9>:\tmov    $0x0,%eax\n'
 '   0x00005555555546b2 <+14>:\tpop    %rbp\n'
 '   0x00005555555546b3 <+15>:\tretq   \n'
 'End of assembler dump.\n')
>>> 

(我在这里使用pprint以便在终端会话中很好地显示它。)

您可以将其写入文件:

>>> with open("logfile","w") as log:
...   log.write(gdb.execute("disassemble main",to_string=True))
... 
335

解析起来并不难,但是只要您使用的是gdb的python扩展名,您就可能希望使用gdb.Architecture.disassemble方法,该方法可以为您完成大部分工作:

>>> frame=gdb.selected_frame()
>>> hex(frame.block().start)
'0x5555555546a4'
>>> hex(frame.block().end) # doc says this is "one past the last address that appears in the block"
'0x5555555546b4'
>>> arch=frame.architecture()
>>> arch.name()
'i386:x86-64'
>>> pp.pprint(arch.disassemble(frame.block().start, frame.block().end - 1))
[{'addr': 93824992233124, 'asm': 'push   %rbp', 'length': 1},
 {'addr': 93824992233125, 'asm': 'mov    %rsp,%rbp', 'length': 3},
 {'addr': 93824992233128, 'asm': 'callq  0x555555554560 <pause@plt>', 'length': 5},
 {'addr': 93824992233133, 'asm': 'mov    $0x0,%eax', 'length': 5},
 {'addr': 93824992233138, 'asm': 'pop    %rbp', 'length': 1},
 {'addr': 93824992233139, 'asm': 'retq   ', 'length': 1}]
>>>

如果您的程序没有调试信息,frame.block()将失败,并显示RuntimeError: Cannot locate block for frame.。您仍然可以成功调用arch.disassemble或gdb disassemble命令;只需使用数字参数即可。