在linux系统中我们写C语言应用程序经常会遇到让编译器不能找出来的错误,它一般在编译后显示为段错误,而段错误不像其它语法错误,编译器会自动提示你错误在哪一行,在这里就不详提出现段错误的原因有哪些,主要是讲讲一些查找段错误的方法,不过提醒下大部分还是因为内存的不合理使用造成的,而C语言在使用内存时一般都是用指针,所以说在写C程序时用指针时一定要小心。下面我就介绍几种比较常用的方法来查找段错误:

方法1:printf的使用

使用printf函数,就是在出现段错误后在你认为会有错误的地方用printf函数随便打印一句话,如果编译后能够看到你写的那句话,那就说明出现段错误的地方在那句printf函数后面,然后接着在后面使用printf函数,直到你要printf打印的那句话在编译后没有打印出来,说明那个出现段错误的地方在printf函数上面。以此方法可以很方便的找出出现段错误的那行代码。这种方法只适合代码少的程序,如果代码很多的话,这种方法就显得非常慢了。

方法2:gdb之动态符号-rdynamic

通过GDB调试工具查找,可以快速方便的查找出现段错误的地方。在此我编写了一个由于指针没有分配内在就使用而导致的段错误的示例test.c:

#include<stdio.h>
int main()
{
int a;
int *p=&a;
int *q;
*p=5;
printf("p=%d\n",*p);
*q=7;
printf("q=%d\n",*q);
}

然后利用gcc编译:[root@localhost test]# gcc test.c -o test -g -rdynamic

然后用gdb调试:[root@localhost test]# gdb test

GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-23.el5)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/test/test...done.
(gdb)

输入命令:r

运行后出现(gdb) r
Starting program: /home/test/test 
p=5
Program received signal SIGSEGV, Segmentation fault.
0x0804853c in main () at 1.c:9
9           *q=7;
(gdb)

我们可以发现出现段错误的地方是第9行代码。分析代码可知指针q出现错误而p没有错误是出于q没有分配内存。 注意:在编译test.c时参数-g 和 -rdynamic 不能少,其中-g 是用来gdb调试的,-rdynamic是用来通知链接器将所有符号添加到动态符号表中。

方法3:gdb之core文件

用命令:ulimit -c unlimit,产生core文件,就是程序运行发行段错误时的文件。我们就继续拿上面的示例代码来说吧,首先输入以下命令: ulimit -c unlimit

接下来的看以下操作:

[root@localhost test]#gcc test.c -o test -g

[root@localhost test]# ls
test.c  core.18161  test

在这里我们发现已经生成了core文件,接下来利用它们调试:
[root@localhost test]# gdb test core.18161 
GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-23.el5)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/test/test...done.
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
#0  0x080483bc in main () at 1.c:9
9           *q=7;
(gdb)

我们发现在输入:gdb test core.18161命令后直接跳到了*q=7的这一行,而这一行也正是出现段错误的代码行。

GDB工具是一个不错的调试工具,利用好了它在以后的调试工作上可以事半功倍。

C程序查找段错误的方法相关推荐

  1. Linux下的段错误调试方法

    转自http://wenku.baidu.com/view/7416d23710661ed9ad51f33f.html 执行socket文件时,出现段错误 (core dumped) 产生段错误就是访 ...

  2. 段错误排查方法与防御性措施~

    什么是段错误 首先我们需要知道什么是段错误,才能对症下药. 段错误是一种在程序运行时发生的错误,通常是由于程序试图访问不在其地址空间范围内的内存引起的. 例如,当一个程序访问空指针或者已经被释放的内存 ...

  3. 几种Linux段错误调试方法

    一.产生段错误的原因 段错误就是指某一进程访问了不属于它权限范围的内存空间,比如:访问了不存在的内存,访问了受系统保护的内存,访问了只读的内存等.下面是一段会产生段错误的实例代码:main.c #in ...

  4. Spark程序运行常见错误解决方法以及优化

    Spark程序运行常见错误解决方法以及优化 参考文章: (1)Spark程序运行常见错误解决方法以及优化 (2)https://www.cnblogs.com/double-kill/p/901238 ...

  5. 牛客网“程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)”错误的可能原因

    晚上在牛客网练习编程,做了一题网易的,很简单的题但是会提示"程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)",想来想去也不懂为什么,本地可以测试通过,然后既没有 ...

  6. Java003-HelloWorld程序及其常见错误解决方法

    Java003-HelloWorld程序及其常见错误解决方法 一.HelloWorld程序 一个正确的HelloWorld程序.可以复制该段代码来检验自己写的代码是否正确(ps:修改类名HelloWo ...

  7. linux程序运行段错误,Linux下的段错误产生的原因及调试方法

    Linux下的段错误产生的原因及调试方法 简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址. 一般来 说,段错误就是指访问的内存超出 ...

  8. Linux平台Segmentation fault(段错误)调试方法

    1. 段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址.访问了系统保护的内存地址.访问了只读的内存地址等等情况. 2. 段错误的原因 段错 ...

  9. linux程序运行段错误,Linux下段错误调试技巧

    更新于2019.04.17 我们写的程序, 尤其是C/C++程序有时候会段错误, 而且往往发生在部署环境而非调试环境, 对问题定位带来很大困难. 这时一般有两种方法来解决问题, 一种是生成core d ...

最新文章

  1. SQL Server 2014 许可证(五)降级与升级
  2. minicom指令_【教程】minicom使用教程
  3. 2019吉首大学计算机调剂,吉首大学2019年硕士研究生调剂考生复试情况分学院公示...
  4. jquery ajax和servlet,浅谈ajax在jquery中的请求和servlet中的响应
  5. ERP沙盘模拟实验报告
  6. GIT入门笔记(2)- 典型的工作模式
  7. LuoguP3674 小清新人渣的本愿 BZOJ4810: [Ynoi2017]由乃的玉米田
  8. 80x86汇编小站站长简单介绍
  9. HugePages 大内存页
  10. 怎么删除微信的手机充值服务器,微信怎么开启和取消自动充值话费功能?
  11. 【Android高级】Android系统以及Activity启动讲解
  12. Activiti7框架学习
  13. php 读取解析excel文件内容,怎么用PHP读取Excel文件信息及内容?(图文+视频教程)...
  14. 【新手学习】Excel操作指南 之一
  15. 如何替换空格、回车符
  16. 着手社区建设掌握的两个概念
  17. 【iCore1S 双核心板_FPGA】例程十五:基于I2C的ARM与FPGA通信实验
  18. Java小程序制作——单词翻译器,原来可以这么简单
  19. 女网姑娘……结婚好哇!
  20. 台湾厂商未来三个月全面上调主板价格

热门文章

  1. 【MacOS】上班一条命令启动所需软件
  2. 现代计算机模型要求程序在执行前,大学计算机基础考试考点
  3. go程序设计语言第八章-goroutine和channel
  4. XXL-JOB调度中心HA及高可用方案
  5. Windows的批处理脚本
  6. 计算机思维导图pdf百度云资源,计算机思维导图
  7. 1896-2021历届奥运会奖牌榜(Python数据处理)
  8. CSDN提现规则说明(更新:支持实时提现)
  9. (黑)群晖设置Ping不通路由器自动关机 实现断电自动关机
  10. VTK可移动三维坐标轴 vtkMovableAxesWidget