[SegFault] 讨厌的段错误 how to debug "Segment Fault" on Linux

Overview

We can get SegFault by several reasons:

  • aligned access to unaligned memory(usally see in ARM NEON)
  • cross-border access
    int temp[2] = {0};
    temp[2] = 2; // SegFault
  • write on read-only access
    char *temp = "Haha";
    temp[1] = 2; // SegFault
  • others

How to find which code line results in segfault

Step 1: DEBUG

DEBUG flavour usually add some assert() statements about the memory alignment access.

Step 2: using gdb

If DEBUG flavour did not give any assert report, or you have fixed all the assert() report, but it still aborts with SegFault. What‘s next?

Usually, we can add "-g" compiler flag and rebuild the executable, then use gdb to locate where is the SegFault.

 1 /* main.c */
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 extern int f0();
 5 extern int f2();
 6 extern int f4();
 7 int f1();
 8 int f3();
 9 int main()
10 {
11     printf("Test for SegFault.\n");
12     return f4();
13 }
14 int f1()
15 {
16     return f0();
17 }
18 int f3()
19 {
20     return f2();
21 }
22
23 /* segfault.c */
24 #include <stdio.h>
25 char f0()
26 {
27     char *tmp = "Haha";
28     tmp[0] = ‘h‘;
29     return tmp[4];
30 }
31 char f2()
32 {
33     return f1();
34 }
35 char f4()
36 {
37     return f3();
38 }

example code

build and run on terminal:

$ gcc main.c segfault.c -o segfault.x
$ ./segfault.x
Test for SegFault.
Segmentation fault (core dumped)

then with gdb:

$ gcc -g -O3 main.c segfault.c -o segfault.x
$ gdb ./segfault.x
GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
(gdb) r
Starting program: /home/jxion/jxion_porting_server/users_jxion/test_segfault/segfault.x
Test for SegFault.
Program received signal SIGSEGV, Segmentation fault.
f0 () at segfault.c:6
6           tmp[0] = ‘h‘;
(gdb) bt
#0  f0 () at segfault.c:6
#1  0x0000000000400557 in f1 () at main.c:19
#2  0x000000000040058b in f2 () at segfault.c:12
#3  0x0000000000400567 in f3 () at main.c:24
#4  0x000000000040059b in f4 () at segfault.c:17
#5  0x00007ffff7a35ec5 in __libc_start_main (main=0x400440 <main>, argc=1, argv=0x7fffffffd6f8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffd6e8)
    at libc-start.c:287
#6  0x0000000000400482 in _start ()
(gdb)

Now you can get all info you need.

时间: 2024-11-19 17:10:00

[SegFault] 讨厌的段错误 how to debug "Segment Fault" on Linux的相关文章

Linux 段错误详解

By Falcon of TinyLab.org 2015/05/12 背景 笔者早年写过一篇:<可恶的"Segmentation faults"之初级总结篇>,网络转载甚多.多年下来,关于段错误的讨论依旧很热烈,该问题也还是很常见.所以打算在这里再系统地梳理一下该问题的来龙去脉. 什么是段错误 下面是来自 Answers.com 的定义: A segmentation fault (often shortened to segfault) is a particular

linux下转格式函数iconv段错误

今天将windows代码移植到Linux下,其中用到了Unicode转char的函数,被坑了一会,相关函数及编码格式,Linux与windows不同,有几点需要注意: 1.wchar_t 在Linux下占用4个字节,在windows下占2个字节: 2.Linux默认的文本编码方式是UTF-8:Linux终端汉字显示的设置方式:vi /etc/sysconfig/i18n: 设置LANG="en_US.UTF-8"或者LANG="zh_CN.UTF-8": 3.ico

Linux环境下段错误的产生原因及调试方法小结(转)

最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址.访问了系统保护的内存地址.访问了只读的内存地址等等情况.这里贴一个对于“段

Linux环境下段错误的产生原因及调试方法小结

最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址.访问了系统保护的内存地址.访问了只读的内存地址等等情况.这里贴一个对于“段错

【转】【调试技巧】Linux环境下段错误的产生原因及调试方法小结

本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误

Linux环境下段错误的产生原因及调试方法小结(转载)

转载自http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间 最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超

C&amp;C++——段错误(Segmentation fault)

C/C++中的段错误(Segmentation fault) Segment fault 之所以能够流行于世,是与Glibc库中基本所有的函数都默认型参指针为非空有着密切关系的.来自:http://oss.lzu.edu.cn/blog/article.php?uid_7/tid_700.html#comment 背景 最近一段时间在linux下用C做一些学习和开发,但是由于经验不足,问题多多.而段错误就是让我非常头痛的一个问题.不过,目前写一个一千行左右的代码,也很少出现段错误,或者是即使出现

C段错误等调试

本文参考 http://stackoverflow.com/questions/2179403/how-do-you-read-a-segfault-kernel-log-message和http://www.slideshare.net/noobyahoo/introduction-to-segmentation-fault-handling-5563036 linux中 遇到 段错误的情况, 多数人会想到core dump, 但是不一定有,其实有其他的办法, 当进程出现这类问题的时候, 使用

段错误详解

Linux环境下段错误的产生原因及调试方法小结 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址.访问了系统保护的内存地址.访