1. 概述

栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等;和堆相比,栈通常很小,在Linux下,通过ulimit -s可以查看栈的大小。

所谓栈溢出,是缓冲区溢出的一种,本质上是写入栈的数据超过栈的大小,使得数据写入其他单元,往往造成不可预期的后果,最常见的就是程序崩溃。

2. 实例

一个栈溢出的程序:

include

usingnamespacestd;

//递归函数

voidstack_test(intgroup)

{

//占用栈内存,1M

chara[1024*1024];

//递归调用

group--;

if(group > 0)

{

cout <

stack_test(group);

}

}

intmain()

{

//函数层级

intlayer;

cin >> layer;

//调用递归函数

stack_test(layer);

return0;

}测试

linux 2.6.9xenu_5-0-0-0下输入命令:

$ ulimit -s

10240

表示栈内存限制10M

编译运行程序:

$ ./bin/test

15

stack   14

stack   13

stack   12

stack   11

stack   10

stack   9

stack   8

stack   7

stack   6

stack   5

stack   4

Segmentation fault (core dumped)

core调试:

$ gdb /home/coresave/core.test.1

core.test.17380.1314809919  core.test.19889.1314811895

[wwww.linuxidc.com@linuxidc test]$ gdb ./bin/test /home/coresave/core.test.19889.1314811895

GNU gdb Red Hat Linux (6.3.0.0-1.96rh)

Copyright 2004 Free Software Foundation, Inc.

GDB is free software, covered by the GNU General Public License, and you are

welcome to change it and/or distribute copies of it under certain conditions.

Type "show copying" to see the conditions.

There is absolutely no warranty for GDB.  Type "show warranty" for details.

This GDB was configured as "x86_64-RedHat-linux-gnu"...Using host libthread_db library "/lib64/tls/libthread_db.so.1".

Core was generated by `./bin/test'.Program terminated with signal 11, Segmentation fault.

Reading symbols from /usr/lib64/libstdc++.so.6...done.

Loaded symbols for /usr/lib64/libstdc++.so.6

Reading symbols from /lib64/tls/libm.so.6...done.

Loaded symbols for /lib64/tls/libm.so.6

Reading symbols from /lib64/libgcc_s.so.1...done.

Loaded symbols for /lib64/libgcc_s.so.1

Reading symbols from /lib64/tls/libc.so.6...done.

Loaded symbols for /lib64/tls/libc.so.6

Reading symbols from /lib64/ld-linux-x86-64.so.2...done.

Loaded symbols for /lib64/ld-linux-x86-64.so.2

#0  0x0000000000400abc in stack_test (group=3) at /home/work/zhouxm/test/src/main.cpp:18

18                      cout << "stack  " << group << endl;

3. 分析原因:1)栈中大数组char a[1024*1024];

2)递归函数

两个信息:

1)Program terminated with signal 11, Segmentation fault.

Signal 11, or officially know as "segmentation fault", means that theprogram accessed a memory location that was not assigned. That'susually a bug in the program.

2) core在cout << "stack  " << group << endl;

在栈溢出的时候,并不一定会马上core,这也是为啥你core的地方常常离出问题的代码很远。

4. 解决

1)在需要占用大内存的时候(例如,大数组),别偷懒,乖乖的用堆!

2)尽量避免层次多的递归函数

linux线程栈溢出与局部变量,Linux下和core说再见之:栈溢出相关推荐

  1. linux 线程_浅谈Linux线程模型

    Thread Basic 基础概念 线程是操作系统能够调度和执行的基本单位,在Linux中也被称之为轻量级进程.从定义中可以看出,线程它是操作系统的概念,在不同的操作系统中的实现是不同的,不过今天分享 ...

  2. linux 线程编译指令i,linux线程篇之(一):线程的创建与应用

    #include#include void thread1(void)//线程1 { int i=0; for(i=0;i<6;i++) { printf("this is a pth ...

  3. linux线程同步互斥说法,linux线程间的同步与互斥知识点总结

    在线程并发执行的时候,我们需要保证临界资源的安全访问,防止线程争抢资源,造成数据二义性. 线程同步: 条件变量 为什么使用条件变量? 对临界资源的时序可控性,条件满足会通知其他等待操作临界资源的线程, ...

  4. linux线程一直在增加,在.net core中遇到的奇怪问题:内存与线程数一直增长

    一个 asp.net core 站点,之前运行在 linux 服务器上,运行一段时间后有时站点会挂掉,有一次的症状是 asp.net core站点在高并发下出现的"EMFILE too ma ...

  5. linux 线程库在哪里,linux线程库

    简单地讲,进程是资源管理的最小单位,线程是程序执行的最小单位.一个进程至少要一个线程作为它的指令执行体,进程管理着资源(比如CPU,内存,文件等),而将线程分配到某个CPU上执行.一个进程当然可以拥有 ...

  6. linux线程并不真正并行,Linux系统编程学习札记(十二)线程1

    Linux系统编程学习笔记(十二)线程1 线程1: 线程和进程类似,但是线程之间能够共享更多的信息.一个进程中的所有线程可以共享进程文件描述符和内存. 有了多线程控制,我们可以把我们的程序设计成为在一 ...

  7. linux线程多参数传递参数,Linux中多线程编程并传递多个参数

    解析Linux中多线程编程并传递多个参数 Linux中多线程编程并传递多个参数实例是本文讲解的内容,不多说,先来看内容. Linux下的多线程编程,并将多个参数传递给线程要执行的函数. 以下是实验程序 ...

  8. linux 线程与进程 pid,linux下线程所属进程号问题

    这一段看<unix环境高级编程>,一个关于线程的小例子. #include #include #include pthread_t ntid; void printids(const ch ...

  9. Linux 线程并发拷贝,【Linux】线程并发拷贝程序

    据说大连某211高校的李教授越来越重口,不仅延续要求他所带的每一个本科班,都要写一份线程并发拷贝程序的传统,而且还开始规定不能用Java语言写作,导致我之前写的<[Java]线程并发拷贝程序&g ...

最新文章

  1. 2020计算机考研准备,2020考研:什么时候开始准备考研最合适?
  2. SAP读取财务报表版本的标准函数
  3. 关于ejabberd限制单点登录
  4. 装修(十三天,面板又换错了,大理石空鼓)
  5. org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException:
  6. Servlet 组件相关的接口、抽象类关系图
  7. 工业POE供电交换机在安防应用中的优势有哪些?
  8. 对象的使用 java 1613806439
  9. 大数据学习笔记11:搭建完全分布式Hadoop
  10. [bzoj4813][Cqoi2017]小Q的棋盘
  11. SQL Server启动的几种方法
  12. spss统计分析基础教程(下)--自学
  13. 射频电路设计的常见问题及经验总结
  14. 公众号文章怎么批量下载导出?
  15. 雷石服务器可以接入电视信号吗,雷石机顶盒使用方法
  16. 龙芯电脑手动编译安装gcc9.3编译器
  17. 如何开启计算机的蓝牙功能吗,win7台式电脑蓝牙怎么开启(电脑蓝牙的开启步骤)...
  18. 解决Raid模式下重装系统无法识别固态硬盘的问题
  19. Spring Security Oauth2 JWT 实现用户认证授权功能
  20. 《奔跑吧Ansible》

热门文章

  1. 密码统计分析工具pipal
  2. WordPress插件扫描工具plecost
  3. android 保存崩溃信息,Android保存每次运行崩溃报告的日志
  4. java调优 视频_Java优化高性能高并发+高并发程序设计视频教程
  5. vdi voi idv区别_VDI桌面虚拟化和IDV桌面虚拟化到底有哪些不同
  6. java绘图机器猫_用绘图语句画机器猫(初学 C 语言的同学必看)
  7. 查看python 3.x 关键字 (保留字)(预留字)
  8. 杰森·保罗:使VR与人眼相匹配还需20年!
  9. 德赛西威与智驾科技MAXIEYE发布“九逵计划”,部署商用车自动驾驶技术及服务...
  10. GitHub换帅!开源大神辞任CEO,竞品GitLab刚完成IPO