代码编译运行环境:Ubuntu 64bits+g++(-g -m64),其中 -g 表示生成调试版本,-m64 表示生成 64bits 程序。


1.错误代码

先贴出出错的核心代码:

struct GPU_task_head head;//局部栈空间上的变量
cout<<"sizeof(GPU_task_head):"<<sizeof(GPU_task_head)<<endl;
memset(&head,0,sizeof(GPU_task_head));//运行时出错

以上代码会出现segmentation fault(core dumped),本以为是memset数组越界,导致的段错误,经过仔细检查并不是memset越界导致的。那为什么呢?

先看一下错误代码的输出:

再看一下ulimit -a命令列出的系统对shell 启动进程所占用的资源限制,列出结果如下:

看图片标红的位置,再对比错误代码的输出的结果中变量的大小,你是否发现了什么!

2.ulimit 命令简介

你是否曾遇到过在程序里面创建线程提示你资源不够,你是否曾遇到过在gcc 中加入 -g 选项,程序崩溃时却没有任何 core 文件产生。如果就,那你就要注意到ulimit命令了。

本次错误也是由于系统对进程资源的限制导致了以上的奇怪的错误结果。memset 栈空间出现段错误是由于系统分每个进程分配的空间不足导致的。

ulimit 通过一些参数选项来管理不同种类的系统资源。这里,我们将讲解这些参数的使用。
ulimit 命令的格式为:ulimit [ options ] [limit]
具体的 options 含义以及简单示例可以参考以下表格。

命令选项 含义 例子
-a 查看全部资源的使用情况 ulimit -a 查看全部资源的使用情况
-H 设置硬资源描述限制,一旦设置,不能更改 ulimit – Hs 64;限制硬资源,线程栈大小为 64K
-S 设置软资源限制,一旦设置,可以增加,但是不能超过软资源的限制 ulimit – Sn 32;限制软资源,32 个文件描述符。
-c core文件最大大小,以blocks为单位 一般常用ulimit -c unlimited,设置为不限大小
-d 设置进程最大数据段的大小,以kbytes为单位 ulimit -d unlimited;对进程的数据段大小不进行限制
-f 设置进程最大可以创建的文件大小,以blocks为单位 ulimit – f 2048;限制进程可以创建的最大文件大小为 2048 blocks
-l 最大可加锁内存大小,以 Kbytes 为单位 ulimit -l 32;限制最大可加锁内存大小为 32 Kbytes
-m 最大内存大小,以 Kbytes 为单位 ulimit – m unlimited;对最大内存不进行限制
-n 可以打开最大文件描述符的数量 ulimit –n128;限制最大可以使用 128 个文件描述符
-p 管道缓冲区的大小,以 Kbytes 为单位 ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes
-s 线程栈大小,以 Kbytes 为单位 ulimit – s 512;限制线程栈的大小为 512 Kbyte
-t 最大的 CPU 占用时间,以秒为单位 ulimit -t unlimited;对最大的 CPU 占用时间不进行限制
-u 用户最大可用的进程数 ulimit – u 64;限制用户最多可以使用 64 个进程
-v 进程最大可用的虚拟内存,以 Kbytes 为单位 ulimit -v 200000;限制最大可用的虚拟内存为 200000 Kbytes

3.错误解决办法

错误代码中局部变量 head 的大小占用了 8.7M 的栈空间,已经超过了系统对 Shell 进程栈空间的限制。虽然在定义时没有报错,但是进行memset 置空值却出现了段错误。因此,我们做如下修改:

ulimit – s 81920

将栈空间改为 81M,这样再运行源程序,顺利通过,问题解决。

参考文献

[1] LINUX ulimit命令

C++ memset 栈空间出现段错误相关推荐

  1. c语言 memset 段错误,memset 导致的一个段错误

    自定义委托类型 - .Net自带委托类型 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递. 与其他的类不同,委托类具有一个签名,并且它只能对与其签名匹配的方法进行引用. ...

  2. Segmentation fault段错误出现原因分析及解决方法笔记

    Segmentation fault段错误出现原因分析及解决方法 1.局部变量的大小过大,超过栈分配的空间导致段错误,如double a[500][500], 解决方法:大数据不要放在栈区中,可以考虑 ...

  3. 段错误(核心已转储)的问题原因

    一个困扰已久的问题,今天终于明白了. core,核心(线圈),没有半导体之前,使用线圈内存,指代内存. 可执行文件是分段存储的,加载进内存也是分段的,如代码段.数据段.堆.栈等,段错误的原因往往是碰到 ...

  4. c语言 memset 段错误,段错误之memset对类对象的误用

    1.问题描述 实际项目中,定义一个如下的基类和子类,均包含有虚函数. //基类 class OriginalTask { public: OriginalTask() {}; virtual ~Ori ...

  5. 段错误之 memset 对类对象的误用

    1.问题描述 实际项目中,定义一个如下的基类和子类,均包含有虚函数. //基类 class OriginalTask { public:OriginalTask() {};virtual ~Origi ...

  6. 在代码段中安排自己定义的栈空间

    如何定义自己的栈(通过系统分配的内存) 完成下面的程序,利用栈.将程序中定义的数据逆序存放. 我们之前是如何安排自己的栈? 设置SS:SP(SS为栈顶的段地址存放处,栈顶偏移地址存放在SP) 我们如何 ...

  7. c语言 段错误 指针,求教为什么指针动态申请了空间,scanf的时候还会段错误

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 while(1) { printf("是否要创建新一条学生信息?(y/n)\n"); scanf("%s",ch) ...

  8. “返回指向栈空间的指针”的错误

    char *GetMemory(void) {char p[] = "hello world";return p;//试图返回一个指向栈空间的指针 }

  9. 用封装的栈回溯类捕获段错误

    本文介绍使用自封装的 backtrace 类对段错误进行捕获,以方便分析运行错误的方法.并给出实现和测试代码. 背景 我们写程序难免会运行出错,常在河边,哪能不湿鞋.出错不可怕,怕的是无法定位问题,像 ...

最新文章

  1. 此问题可能是由配置更改或安装另一个扩展导致的
  2. 《计算机网络课程设计(第2版)》——3.4节课程设计分析
  3. 一周最新示例代码回顾 (5/7–5/13)
  4. C语言 输入一个正整数n,再输入n个字符,如果是小写字符就将其转换为大写字符,如果是大写字符就 转换为小写字符
  5. TF版本升级问题:成功解决AttributeError: module tensorflow has no attribute mul
  6. java criteria exist_Java Criteria.addExists方法代碼示例
  7. 曙光服务器优势,5大核心优势 探秘曙光Cloudview三大平台
  8. linux fstab 权限,linux中fstab文件配置简介
  9. 为了更准确的验证码而奋斗-云大urp教务系统大作战(1.5)
  10. HDOJ 4734 数位DP
  11. android gridvie item,Android开发―解决自定义GridView高度第一个item高度异常问题
  12. 每次打印只能打打印一页
  13. html公式输入空格,mathtype怎么在公式里加空格
  14. 精英二代手柄测试软件,微软精英手柄2代评测 继续引领行业标准
  15. bp神经网络算法原理公式,bp神经网络算法推导
  16. java列举生活中类和对象_趣味解读Python面向对象编程 (类和对象)
  17. 【专利】如何画专利流程图(逻辑图)
  18. 计算机各类会议及投稿文章总结,个人感觉入门超级有用!
  19. torch.sqrt(lhs**2) 与torch.abs(lhs)在pytorch中的差异
  20. 细胞膜杂化脂质体载紫杉醇/红细胞膜包被雷公藤甲素-红素仿生共载脂质体的研究制备

热门文章

  1. IT兄弟连 Java语法教程 编写Java源代码
  2. thinkphp源码分析(三)—自动加载篇(Loader的分析)
  3. 网上答题及其自动评测系统
  4. 阿里“双十一”决胜物流战 智能、开放才能走的更远
  5. 关于超过255台电脑的内网IP规划问题
  6. C#写一个URL编码转换GB23121的方法,然后可以取到天气预报
  7. csgo手机上看demo_仪表上的车速和手机导航不一样,哪个更准?碰到测速了该看哪个?...
  8. L1-079 天梯赛的善良 (20 分)-PAT 团体程序设计天梯赛 GPLT
  9. 蓝桥杯 ALGO-143 算法训练 字符串变换
  10. PAT 乙级 1003. 我要通过!(20) Java版