自从学习在linux下开发以来,segment fault便是家常便饭了。对付此类问题,通常办法:

1、调试或看coredump文件,查看调用堆栈找出错点,通常能准确定位;

2、有些隐藏问题直接看调用堆栈是发现不了的,这时候用valgrind来看下哪里内存使用有问题,能发现更多的问题。

最近遇到的几个错误不那么明显,最后用valgrind找出毛病的案例:

1、代码写的逻辑有点复杂,中间有很多的return,造成了malloc和free不配对 ,由于是自动变量未初始化,结果free时也能正常走,但是到了其他地方就出错了,出错的地方跟这一点关系也没有,直接找无从下手。最后用valgrind一查,提示用了未初始化的变量,找到了问题所在。

2、 用sprintf构造字符串,结果字符串申请的空间计算错了,打印一个整数("%d"),却只申请了4个字节,结果测试时,循环跑,跑到999没问题,一到1000就出错。

3、C++程序,结构体里用string, 正常用也是没问题的,为了方便某些扩展,由外面new了char类型的空间,空间大小为sizeof结构体,然后传进来buffer指针,在内部用static_cast转成结构体指针后,给string字段赋值,问题就出在这了。C和C++混用时要特别注意啊。

总结下:

前两个是开发人员的低级错误,规范的代码写法(声明时初始化等)、做好代码评审工作,这些问题应该能避免。

最后一个是由于使用了开源代码库,对代码框架了解不深,修改时照葫芦画瓢添加功能,结果出了问题,用别人的东西一定要搞明白,不能随便照抄,不然风险很大啊。

另外在发现编译的共享库不能调试,valgrind出错也不提示行数,在makefile里加了-g选项也不好使, 后来一看原来链接时加了-Wl,-s选项,gcc上查了下,含义如下:

-s:Remove all symbol table and relocation information from the executable.

去掉后就可以正常调试,提示出错位置了。

转载于:https://www.cnblogs.com/lao9/archive/2009/12/19/1627961.html

Segment fault之痛相关推荐

  1. Linux下如何生成core dump 文件(解决segment fault段错误的问题)

    Linux下如何生成core dump 文件(解决segment fault段错误的问题) 参考文章: (1)Linux下如何生成core dump 文件(解决segment fault段错误的问题) ...

  2. segment fault

    2019独角兽企业重金招聘Python工程师标准>>> 一 造成segment fault,产生core dump的可能原因 容器使用越界问题 for(iter=q.begin(); ...

  3. Segment fault及LINUX core dump详解

    C 程序在进行中发生segment fault(core dump)错误,通常与内存操作不当有关,主要有以下几种情况: (1)数组越界. (2)修改了只读内存. (3)scanf("%d&q ...

  4. GDB调试core文件样例(如何定位Segment fault)

    core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (Linux中如果内存越界会收到SIG ...

  5. arm-linux-ld segment fault,segment fault 定位 与 远程 gdb

    远程 GDB 首先 ,Target 为 ARM开发板 (IP =  192.168.1.200),HOST 为 Ubuntu 14.04 虚拟机 (IP = 192.168.1.4) 1. 下载  g ...

  6. memcpy越界引起的segment fault

    memcpy(dst, src, size); 如果size过大,dst或者src指向的内存空间申请过小的话,就会导致memcpy越界访问,导致segment fault.

  7. 在linxu中经常发生段错误(segment fault)的原因

    我们在linux上写代码,并运行程序时,经常会碰到程序执行到一半发生"segment fault"的错误,一头雾水,而且对这类问题的排查也是相当麻烦的一件事.而且我在面试的过程中也 ...

  8. linux学习记录-coredump segment fault

    linux学习记录: 1.coredump:段错误; 总线错误; 程式记忆体区段错误; 链接:http://www.cnblogs.com/doctorqbw/archive/2011/12/21/2 ...

  9. 【转】造成segment fault,产生core dump的可能原因

    2019独角兽企业重金招聘Python工程师标准>>> 1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字 ...

最新文章

  1. AI智能手机会是什么样?至少有这十个功能
  2. JFrame 简单使用
  3. pidstat 命令查看某个进程的CPU、内存、磁盘使用情况
  4. 中间人攻击之DNS欺骗
  5. 二叉堆与二叉堆的构建
  6. VC实现动画应用两则
  7. 每日一题/003/微积分/极限问题转化为定积分的定义
  8. C语言数字雨--90行代码
  9. android studio高考倒计时,高考倒计时app排行榜
  10. 于的繁体字有几种写法_【于字书法繁体字怎么写】作文写作问答 - 归教作文网...
  11. 英特尔显卡linux管理_Intel Linux 显卡驱动安装指南
  12. CSS Tricks - 你应该知道的 CSS 技巧
  13. Delphi XE8 程序瘦身.编译后EXE最低90KB
  14. 详解统计套利交易系统模型
  15. “那不勒斯”服务器芯片,那不勒斯定名 AMD发布全新CPU品牌EPYC
  16. 解决C#调用Excel接口时报错,提示:Microsoft.Office.Interop.Excel.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Offi
  17. 算法:数字的排列组合问题
  18. 垃圾回收只知道标记清除?一文帮你打通V8垃圾回收
  19. Mask R-CNN完整翻译
  20. 机器学习项目(一)——垃圾邮件的过滤技术

热门文章

  1. 【LINUX】Oracle数据库 linux磁盘头数据损坏修复
  2. python pynlpir NLPIR许可证过期问题【RuntimeError: NLPIR function ‘NLPIR_Init‘ failed.】
  3. OCM备考 三. Managing Database Availability 之RMAN高级操作
  4. ORA-00257: archiver error. Connect internal only, until freed.
  5. oracle中minus
  6. linux系统中查看gcc内置宏定义的命令方法
  7. 小米oj 有多少个公差为2的等差数列
  8. 另存为常用位置设置 1.0 绿色版
  9. ----------------学习进度表---------------------------------
  10. mysql导入导出数据库文件(转载)