概述
我个是我自已在开发过程中发现的一个小技巧。不算什么牛X的技巧。只是帖出来大家一起欣赏一下而已。权当一道小菜吧。
gdb反汇编调试技巧 |
在linux下很多时候我们需要反汇编我们的源码,然后根据所得到的信息(例如相关的寄存器)进一步定位问题所在。这时候我们很多时间用objdump或者直接用gdb。在用gdb的情况下可以对可疑的函数采用disassemble funcname来反汇编对应的funcname函数。但如果在对汇编不是很熟的情况下我们通常不容易将源码与对应的汇编匹配起来思考。例如: void main() { inta_main=1; int i = 0x77; //技巧所在 a_main=(int)yaya; foo(); int j = 0x88; //技巧所在 } 当我们disassemble这个函数时得到的汇编代码可能比较多,而我们感兴趣的只有func2这一段代码。就可在上下两段中加入”标识行”。然后在反汇编的汇编代码中查找标识77、88然后只要看这中间的就OK了。注意千万不能加优化选项,因为加优化选项这些没有起实际作用的代码会被优化掉。另外最好用16进制作标识,因为立即数会以16进制显示。 在不优化的时候其反汇编的代码如下: 0x080483d6 <main+0>: lea 0x4(%esp),%ecx 0x080483da <main+4>: and $0xfffffff0,%esp 0x080483dd <main+7>: pushl -0x4(%ecx) 0x080483e0 <main+10>: push %ebp 0x080483e1 <main+11>: mov %esp,%ebp 0x080483e3 <main+13>: push %ecx 0x080483e4 <main+14>: sub $0x10,%esp 0x080483e7 <main+17>: movl $0x1,-0x10(%ebp) 0x080483ee <main+24>: movl $0x77,-0xc(%ebp) 0x080483f5 <main+31>: movl $0x804839f,-0x10(%ebp) 0x080483fc <main+38>: call 0x80483ba <foo> 0x08048401 <main+43>: movl $0x88,-0x8(%ebp) 0x08048408 <main+50>: add $0x10,%esp 0x0804840b <main+53>: pop %ecx 0x0804840c <main+54>: pop %ebp 0x0804840d <main+55>: lea -0x4(%ecx),%esp 0x08048410 <main+58>: ret
我们只需要查看红色字符中的代码段就OK了。 |
最后
以上就是无语曲奇为你收集整理的linux反汇编旁门左道小技巧一则的全部内容,希望文章能够帮你解决linux反汇编旁门左道小技巧一则所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复