我有一个核心转储,其中堆栈已损坏。我试着拆开它,发现以下请帮助我分析它..
(gdb) bt
#0 0x55a63c98 in ?? ()
#1 0x00000000 in ?? ()
(gdb) disassemble 0x55a63c90 0x55a63ca8
Dump of assembler code from 0x55a63c90 to 0x55a63ca8:
0x55a63c90: add %cl,%dh
0x55a63c92: cmpsb %es:(%edi),%ds:(%esi)
0x55a63c93: push %ebp
0x55a63c94: add %al,(%eax)
0x55a63c96: add %al,(%eax)
**0x55a63c98: pusha**
0x55a63c99: lret $0x9
0x55a63c9c: subb $0x56,0xd005598(%ebp)
0x55a63ca3: push %ebp
0x55a63ca4: jo 0x55a63cc5
0x55a63ca6: sahf
0x55a63ca7: push %ebp
End of assembler dump.
(gdb) q
这个 pusha 指令可以导致核心转储吗?
不*,pusha所做的就是将所有通用寄存器压入堆栈,包括堆栈指针!导致核心转储的是 pusha 之后的指令 lret,它是一个带有堆栈弹出的长返回。返回地址是压入堆栈的最新值,在本例中,它是 esi:edi 中的任何内容(因为它们是 pusha 指令压入的最后一个值),并且很可能指向某个随机位置。
* 除非你用完堆栈空间。
我是一名优秀的程序员,十分优秀!