From: http://blog.sina.com.cn/s/blog_45497dfa0100mddb.html
5. 一个小方法来测试产生core文件
//---------------------------------------------------------------
直接输入指令:
kill -s SIGSEGV $$
以前写的一个文档,有同学反馈不能用,恰好手头有一个堆栈被破坏的core文件要查看,跑了一遍重新更新了一下原来的文档。
-----------------------------------------------------
调试core文件的时候,偶尔会遇到调用堆栈被破坏的情况,一大串问号令人头痛。类似下面:
echou大师介绍了一种手动恢复调用堆栈的方法,cesc研究了一下,跟大家share下。
首先回顾一些背景知识:
%esp 是堆栈指针寄存器,它指向当前堆栈储存区域的顶部.
?p 是基址寄存器,它指向当前堆栈储存区域的底部.
%eip 是指令指针,是下一条要执行的指令地址.
当发生函数调用时,程序如下操作:首先把参数压入堆栈;然后保存指令寄存器(EIP)中的内容做为返回地址(RET);第三个放入堆栈的是基址寄存器(EBP);然后把当前的栈指针(ESP)拷贝到EBP,做为新的基地址;最后为本地变量留出一定空间,把ESP减去适当的数值。如下所示:
Low
addresses
-----------------------------------
0(%esp) | 栈顶
---------|-------------------------
-n(?p) | 被调函数的栈空间,局部变量在此分配,这段是可变的
0(?p) |上层函数调用的栈基地址
4(?p) |返回地址