两段栈溢出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
相关产品推荐
相关产品推荐

