当前位置: 首页 > news >正文

GDB调试 core dump 文件与栈溢出分析

文章目录

  • 调试源码地址
  • 打开 Core dump (核心转储)
  • 段错误调试
    • coredump1-section
    • coredump2-section

调试源码地址

打开 Core dump (核心转储)

Core dump操作系统在程序异常终止(如崩溃segmentation fault 等)时,将程序当时的内存状态、寄存器信息、堆栈数据等关键信息保存到一个文件中的机制

首先再Ubuntu上咱们要先打开Core dump
通过ulimit -c这个命令可以看到当前core文件的大小是 0

在这里插入图片描述
在这个环境下我们编译一下coredump1-section里的会照成段错误的代码

int main()
{int *p = 0;*p = 10;// 试图对空指针进行解引用操作并赋值return 0;
}

在这里插入图片描述
可以看到生成了一个可执行文件,此时运行会报错Segmentation fault

并且可以看到没有生成任何core dump文件
在这里插入图片描述
此时可以通过命令ulimit -c unlimited设置core domp文件的大小为无限制
在这里插入图片描述
可以看到在生成段错误的时候后面还跟上了Segmentation fault (core dumped)
并且生成了core dump文件
可以通过命令
echo -e “%e-%p-%t” > /proc/sys/kernel/core_pattern

对core dump文件进行改名,默认都是只生成core命名的文件

段错误调试

打开自动生成core dump文件以后我们就可以开始进行调试啦

coredump1-section

通过命令 gdb + 可执行文件 + 对应文件生成的core dump文件名 即可开始调试
gbd ./coredump1-section coredump1-secti-14407-1754905207

在这里插入图片描述
运行后我们可以看到程序停在了12行
在这里插入图片描述
通过 gdb的命令 p p
(第一个p的意思是print 第二个p是指针)
可以看到p指针为空指针,那此时进行赋值肯定是有问题的

coredump2-section

接着我们看看第二个例子

void set_value(char* str,int num)
{str[num-1]='\0';
}
string get_file_list(int total_num,int size)
{string res;for(int i=0;i<total_num;i++){char *str = (char*)alloca(size);set_value(str,size);res = res + string(str);}return res;
}
int main(int argc,char** argv)
{string str = get_file_list(atoi(argv[1]),atoi(argv[2]));cout << "get file list completed" << endl;return 0;
}

一个简单的通过alloca申请空间并自动释放的例子
第一个参数表示生成多少个空间(调用多少次alloc)
第二个参数表示每次生成的空间的大小
在这里插入图片描述
通过图片可以看到当程序传参为
100 100
1000 1000
的时候都没出问题,但是参数为10000 1000的时候发生了段错误
会是空间分配失败导致的吗?
通过计算可得 10000 * 1000 / 1024 = 9537(M)(八字节对齐)
仅仅9兆,怎么可能会分配失败呢
调试一下看看
gdb ./coredump2-section coredump2-secti-15999-1754906708

可以看到,程序在19行的时候被段错误的信号中断了
在这里插入图片描述
通过 bt得知我们目前就在get_file_list函数栈里
通过i locals (这里的 i 表示Info)可以看到当前栈帧的变量
在这里插入图片描述
可以看到在 i (for循环里的变量)等于8314的时候str产生了不正常的内存访问

i = 8314
8314 * 1000(传参进来决定每块内存的大小) / 1024 = (约)8 M

通过命令也能看到我们的内存也还有很多,所以不可能是内存分配不够导致的
在这里插入图片描述

那我们就智能往上怀疑了因为19行的函数里什么都没有,这时就要看看alloca()函数的手册了

这时就能发现alloca分配的其实是栈空间!
在这里插入图片描述
通过命令!ulimit -a可以看到我们的栈空间大小只有8192kb
而8314 * 1000 /1024 = 8119
在这里插入图片描述
加上其他变量的空间,自然就爆栈了

http://www.lryc.cn/news/617544.html

相关文章:

  • 农业气象站的应用场景拓展
  • 学习观察和行动:机器人操作中任务-觉察的视图规划
  • 2025年渗透测试面试题总结-13(题目+回答)
  • Python训练营打卡 DAY 33 MLP神经网络的训练
  • 首涂模板第45套主题2.0修正版苹果CMS模板奇艺主题二开源码
  • 【AxureMost落葵网】CRM客户关系管理原型系统-免费
  • MD5:理解MD5 / MD5核心特性 / MD5 在前端开发中的常见用途 / 在线生成MD5 / js-md5
  • 【Kafka系列】第三篇| 在哪些场景下会选择使用 Kafka?
  • 【车联网kafka】Kafka核心架构与实战经验(第三篇)
  • 钓鱼鱼饵制作的方式
  • Go 多进程编程-同步
  • 免费好用的数字人API
  • synchronized 、volatile 以及 ReentrantLockReentrantLock 的区别
  • monorepo架构设计方案
  • 小白入门指南:Edge SCDN 轻松上手
  • 【NOI】落谷2025/08/10 SCP-J 模拟测试 第10题 求构成三角形的概率
  • qss基础
  • Godot ------ 平滑拖动02
  • 机器学习第九课之DBSCAN算法
  • 智慧工地:以三大监测技术筑牢安全屏障
  • (Arxiv-2025)Phantom-Data:迈向通用的主体一致性视频生成数据集
  • Qwen 3 架构深度解析:混合推理、MoE创新与开源生态的全面突破
  • 工业智造新引擎:BRAV-7135赋能自动化产线升级
  • 第八篇:交互入门:鼠标拾取物体
  • 可视化+自动化:招聘管理看板软件的核心技术架构解析
  • 网络资源模板--基于Android Studio 实现的手绘板App
  • Docker部署MySQL完整指南:从入门到实践
  • Oracle主从incarnation不一致问题解决
  • 如何网络“钓鱼”,钓鱼鱼饵生成工具CobaltStrike使用
  • 云原生应用的DevOps2(Jenkins渗透场景)