linux之栈溢出分析

[复制链接]
发表于 2026-10-7 09:51:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

问题现象

栈溢出(Stack Overflow)是 C/C++ 程序中常见的一类运行时错误:当函数调用层级过深,或者每次调用都在栈上分配过大的局部变量,导致栈空间被耗尽时,程序会崩溃并生成 core dump 文件。下面用一个缺少终止条件的递归函数来复现该问题。

示例代码

下面的递归函数没有正确的退出条件,每次调用都会在栈上分配 1KB 的局部数组,无限递归最终触发栈溢出:

#include <stdio.h>
void recursive_function(int n) {
    char large_array[1024]; /* 每次递归调用都会在栈上分配这么多空间 */
    printf("Level %d, address of array: %p\n", n, &large_array);
    recursive_function(n + 1);
}

int main() {
    recursive_function(1);
    return 0;
}

用 GDB 分析 core dump

编译并运行上面的程序会崩溃并生成 core 文件。使用 GDB 加载可执行文件与 core 文件即可查看调用栈:

gdb ./a.out core

进入 GDB 后,用 bt(backtrace)查看栈回溯,会看到 recursive_function 被反复调用了上万层,这正是栈溢出的直接证据。也可以用 list 命令定位到源码对应的行号。

如何避免

  • 确保递归函数存在明确的终止条件(基线条件)。
  • 避免在栈上分配过大的局部数组,可改用动态内存(malloc)或全局/静态存储。
  • 如确有深度递归需求,可改用迭代实现,或增大线程栈大小。
  • 编译时开启栈保护选项(如 -fstack-protector)有助于尽早发现问题。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表