栈溢出的调试及解决办法

※ 问题:

栈上消耗的内存太多,导致溢出,程序崩溃。

※ 程序崩溃的过程是怎样的?

1. CPU 执行代码时,反复地压栈;
2. 访问栈上内存时缺页, CPU 抛异常,操作系统内核接管;
3. 操作系统内核计算出异常地址已经低于栈的低地址,所以拒绝补页,同时抛出软件异常;
4. 程序崩溃,调试器接管,或者提示错误并退出。

※ 如何知道栈的大小?

一个简单的办法是,程序崩溃后,在调试器里,对比函数调用栈最高和最低处的栈指针即可。

※ 如何调整栈的大小?

设置全局配置、修改可执行文件内部属性、创建线程前指定栈大小等等。比如:

1. 主线程: ldrel -S 10M -L <program>   /* 10M + Lazy */
2. 子线程: pthread_attr_setstacksize() + pthread_attr_setstacklazy()

Read More: