Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 用gdb调试反汇编库_Assembly_X86_Gdb_Disassembly - Fatal编程技术网

Assembly 用gdb调试反汇编库

Assembly 用gdb调试反汇编库,assembly,x86,gdb,disassembly,Assembly,X86,Gdb,Disassembly,在Linux和Mac OS X中,我可以使用stepi和nexti调试应用程序,而无需调试信息 在Mac OS X上,gdb显示了在库中调用的函数,尽管有时会在每个stepi指令中前进几个汇编程序指令 在Linux上,当我进入一个动态库时,gdb就会丢失。例如,对于puts(),puts()中有三条汇编指令,一旦gdb到达0x080482bf的跳转,它就会失败,并显示消息“没有函数包含所选帧的程序计数器” 0x080482ba输入puts@plt () (gdb)拆卸 函数的汇编代码转储puts

在Linux和Mac OS X中,我可以使用stepi和nexti调试应用程序,而无需调试信息

在Mac OS X上,gdb显示了在库中调用的函数,尽管有时会在每个stepi指令中前进几个汇编程序指令

在Linux上,当我进入一个动态库时,gdb就会丢失。例如,对于puts(),puts()中有三条汇编指令,一旦gdb到达0x080482bf的跳转,它就会失败,并显示消息“没有函数包含所选帧的程序计数器”

0x080482ba输入puts@plt ()
(gdb)拆卸
函数的汇编代码转储puts@plt:
0x080482b4:jmp*0x8049580
0x080482ba:推送$0x10
0x080482bf:jmp 0x8048284
汇编程序转储结束。
(gdb)stepi
0x080482bf英寸puts@plt ()
(gdb)stepi
0x08048284英寸??()
(gdb)拆卸
没有函数包含所选帧的程序计数器。

您知道如何使用gdb调试这些库调用。

如果gdb没有您尝试调试的函数的调试符号,gdb将无法确定要反汇编的内存地址范围。要解决此问题,可以将范围传递到
反汇编
命令中。例如:

(gdb) p $pc
$4 = (void (*)()) 0x70c72d <_IO_puts+29>
(gdb) disassemble 0x70c72d 0x70c740
Dump of assembler code from 0x70c72d to 0x70c740:
0x0070c72d <_IO_puts+29>:   mov    %eax,(%esp)
0x0070c730 <_IO_puts+32>:   call   0x721f10 <strlen>
0x0070c735 <_IO_puts+37>:   mov    0x84c(%ebx),%edx
0x0070c73b <_IO_puts+43>:   cmpw   $0x0,(%edx)
0x0070c73f <_IO_puts+47>:   mov    %edx,-0x10(%ebp)
End of assembler dump.
(gdb)p$pc
$4=(无效(*)()0x70c72d
(gdb)拆解0x70c72d 0x70c740
将汇编程序代码从0x70c72d转储到0x70c740:
0x0070c72d:mov%eax,(%esp)
0x0070c730:调用0x721f10
0x0070c735:mov 0x84c(%ebx),%edx
0x0070c73b:cmpw$0x0,(%edx)
0x0070c73f:mov%edx,-0x10(%ebp)
汇编程序转储结束。

可能有一种方法可以安装调试符号。在我的Ubuntu系统上,我安装了包
libc6 dbg
,它允许我进入标准库中的函数。

另外,在Linux上使用stepi会发生什么?你说你根本无法一步一步地完成指令,但你没有描述实际发生的事情。您可以发布一个示例会话吗?谢谢,我正在使用Slackware 13.0及其预装的gdb 6.8。我已经澄清了发生了什么。GNU gdb(gdb)7.4.1-debian。现在正确的语法是
反汇编0x70c72d、0x70c740
。那就是必须有逗号。
(gdb) p $pc
$4 = (void (*)()) 0x70c72d <_IO_puts+29>
(gdb) disassemble 0x70c72d 0x70c740
Dump of assembler code from 0x70c72d to 0x70c740:
0x0070c72d <_IO_puts+29>:   mov    %eax,(%esp)
0x0070c730 <_IO_puts+32>:   call   0x721f10 <strlen>
0x0070c735 <_IO_puts+37>:   mov    0x84c(%ebx),%edx
0x0070c73b <_IO_puts+43>:   cmpw   $0x0,(%edx)
0x0070c73f <_IO_puts+47>:   mov    %edx,-0x10(%ebp)
End of assembler dump.