在探究完类成员变量分布后,来定位一个coredump例子来实践一把:
(gdb) bt
#0 0x0804863c in xuzhina_dump_c06_s2_ex::print() ()
#1 0x08048713 in main ()
看一下xuzhina_dump_c06_s2_ex::print的汇编:
(gdb) disassemble 0x0804863c
Dump of assembler code for function _ZN22xuzhina_dump_c06_s2_ex5printEv:
0x08048610 <+0>: push %ebp
0x08048611 <+1>: mov %esp,%ebp
0x08048613 <+3>: sub $0x28,%esp
0x08048616 <+6>: movl $0x0,-0xc(%ebp)
0x0804861d <+13>: jmp 0x804869b <_ZN22xuzhina_dump_c06_s2_ex5printEv+139>
0x0804861f <+15>: mov 0x8(%ebp),%eax
0x08048622 <+18>: movzwl (%eax),%eax
0x08048625 <+21>: cwtl
0x08048626 <+22>: test %eax,%eax
0x08048628 <+24>: je 0x8048631 <_ZN22xuzhina_dump_c06_s2_ex5printEv+33>
0x0804862a <+26>: cmp $0x1,%eax
0x0804862d <+29>: je 0x8048654 <_ZN22xuzhina_dump_c06_s2_ex5printEv+68>
0x0804862f <+31>: jmp 0x8048676 <_ZN22xuzhina_dump_c06_s2_ex5printEv+102>
0x08048631 <+33>: mov 0x8(%ebp),%eax
0x08048634 <+36>: mov 0x14(%eax),%edx
0x08048637 <+39>: mov -0xc(%ebp),%eax
0x0804863a <+42>: add %edx,%eax
=> 0x0804863c <+44>: movzbl (%eax),%eax
0x0804863f <+47>: movsbl %al,%eax
0x08048642 <+50>: mov %eax,0x4(%esp)
0x08048646 <+54>: movl $0x80487c4,(%esp)
0x0804864d <+61>: call 0x80484a0 <printf@plt>
0x08048652 <+66>: jmp 0x8048697 <_ZN22xuzhina_dump_c06_s2_ex5printEv+135>
0x08048654 <+68>: mov 0x8(%ebp),%eax
0x08048657 <+71>: mov 0x14(%eax),%eax
0x0804865a <+74>: mov -0xc(%ebp),%edx
0x0804865d <+77>: shl $0x2,%edx
0x08048660 <+80>: add %edx,%eax
0x08048662 <+82>: flds (%eax)
0x08048664 <+84>: fstpl 0x4(%esp)
0x08048668 <+88>: movl $0x80487c8,(%esp)
0x0804866f <+95>: call 0x80484a0 <printf@plt>
0x08048674 <+100>: jmp 0x8048697 <_ZN22xuzhina_dump_c06_s2_ex5printEv+135>
0x08048676 <+102>: mov 0x8(%ebp),%eax
0x08048679 <+105>: mov 0x14(%eax),%eax
0x0804867c <+108>: mov -0xc(%ebp),%edx
0x0804867f <+111>: shl $0x2,%edx
0x08048682 <+114>: add %edx,%eax
0x08048684 <+116>: mov (%eax),%eax
0x08048686 <+118>: mov %eax,0x4(%esp)
0x0804868a <+122>: movl $0x80487cc,(%esp)
0x08048691 <+129>: call 0x80484a0 <printf@plt>
0x08048696 <+134>: nop
0x08048697 <+135>: addl $0x1,-0xc(%ebp)
0x0804869b <+139>: mov 0x8(%ebp),%eax
0x0804869e <+142>: mov 0x18(%eax),%eax
0x080486a1 <+145>: cmp -0xc(%ebp),%eax
0x080486a4 <+148>: seta %al
0x080486a7 <+151>: test %al,%al
0x080486a9 <+153>: jne 0x804861f <_ZN22xuzhina_dump_c06_s2_ex5printEv+15>
0x080486af <+159>: leave
0x080486b0 <+160>: ret
End of assembler dump.
更多内容请关注微信公众号“debugeeker", 链接为https://mp.weixin.qq.com/s/39Fe3T8ONps6DL1WR_fLUg