You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两段栈溢出C程序的core dump文件大小差异异常原因咨询

问题解释:递归栈溢出程序的Core Dump大小差异

这个差异的核心原因是core dump的压缩率不同,根源在于两个程序的栈内容重复度存在巨大差距:

1. 栈帧结构与递归深度

从你提供的汇编代码可以看到,两个程序的f函数栈帧结构完全一致:每个栈帧都会分配16字节的栈空间,加上push %rbp和call指令占用的栈空间,每次递归都会消耗固定大小的栈内存。由于默认栈大小是固定的(通常为8MB),两个程序的递归深度几乎相同,栈的实际内存占用量也基本一致。

2. 栈内容的重复度差异

  • a.c程序:每次递归传递的参数i始终是1,因此每个栈帧中存储参数的位置(-0x4(%rbp))写入的都是相同的值;同时,所有递归调用的返回地址都是固定的0x113e,栈帧中的rbp地址也是连续递减的规律值。整个栈的内容存在大量重复的片段。
  • b.c程序:每次递归传递的参数是i+1,栈帧中存储参数的位置会依次写入1、2、3……递增的唯一值,这部分内容没有重复,打破了栈内容的规律性。

3. Core Dump的压缩机制

你使用的coredumpsctl是通过systemd journal存储core dump文件的,而journal默认会对存储的内容进行压缩。由于a.c的栈内容重复度极高,压缩率远高于b.c(几乎可以用极小的空间存储重复片段),最终导致两个core dump文件的大小出现4倍以上的差距。

验证方法

如果想要确认这一点,可以修改系统的core dump配置,让其生成未压缩的原始core文件:

# 临时修改core_pattern,生成未压缩的core文件
echo "/tmp/core.%p" | sudo tee /proc/sys/kernel/core_pattern

重新运行两个程序后,你会发现生成的core.*文件大小几乎一致,因为它们的实际栈内存占用量是相同的。

内容的提问来源于stack exchange,提问作者Amir reza Riahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 11:54:51