设置: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服务器。我的目标是汇编程序命令。没有小精灵文件矿,我从中获取源代码。仅仅是控制器程序存储器中的纯机器指令,我需要打印出来。
答案 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
命令;只需使用数字参数即可。