一.产生段错误的原因

段错误就是指某一进程访问了不属于它权限范围的内存空间,比如:访问了不存在的内存,访问了受系统保护的内存,访问了只读的内存等。下面是一段会产生段错误的实例代码:main.c
#include <stdio.h>
#include <string.h>void test()
{char *p = NULL;*p = 'T';
}int main()
{test();return 0;
}

编译运行main.c,会输出段错误提示

wbhuang@ubuntu:~/src/test_debug_segmentation$ gcc -g -o main main.c wbhuang@ubuntu:~/src/test_debug_segmentation$ ./main Segmentation fault (core dumped)

二.段错误调试方法

[方法一]使用gdb进行调试

编译时确保gcc的带参数"-g",启动gdb,调试main

wbhuang@ubuntu:~/src/test_debug_segmentation$ gdb main
GNU gdb (GDB) 7.5-ubuntu
Copyright (C) 2012 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 "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/wbhuang/src/test_debug_segmentation/main...done.
(gdb)

执行gdb命令r/run,则会输出段错误的相关信息

(gdb) r
Starting program: /home/wbhuang/src/test_debug_segmentation/main Program received signal SIGSEGV, Segmentation fault.
0x080483ec in test () at main.c:7
7       *p = 'T';
(gdb)

[方法二]使用objdump

首先先执行./main输出提示段错误,然后执行dmesg命令,在输出信息的最底下找到最近一次发生段错误的记录

[ 4522.506831] main[3154]: segfault at 0 ip 080483ec sp bf80c2c0 error 6 in main[8048000+1000]

这里有两个重要信息,一个是"segfault at 0"和"ip 080483ec",这就是说发生断错误的地址为:0,而指令指针地址为:080483ec。

接下来使用objdump命令,objdump是用来查看目标文件(二进制文件)或者可执行的目标文件的构成的工具

wbhuang@ubuntu:~/src/test_debug_segmentation$ objdump -d ./main > maindump

用vim查看maindump文件,下面的141  80483ec:这一行就是段错误发生时执行的指令了,接下来只需将汇编代码匹配到源码就Ok了。

./main:     file format elf32-i3863 4 5 Disassembly of section .init:6 7 08048294 <_init>:8  8048294:       53                      push   %ebx9  8048295:       83 ec 08                sub    $0x8,%esp......
135 080483dc <test>:
136  80483dc:       55                      push   %ebp
137  80483dd:       89 e5                   mov    %esp,%ebp
138  80483df:       83 ec 10                sub    $0x10,%esp
139  80483e2:       c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%ebp)
140  80483e9:       8b 45 fc                mov    -0x4(%ebp),%eax
141  80483ec:       c6 00 54                movb   $0x54,(%eax)
142  80483ef:       c9                      leave
143  80483f0:       c3                      ret......

 [方法三]使用catchsegv

catchsegv ./main
Segmentation fault (core dumped)
*** Segmentation fault
Register dump:EAX: 00000000   EBX: b7738000   ECX: bff696e4   EDX: bff69674ESI: 00000000   EDI: 00000000   EBP: bff69640   ESP: bff69630EIP: 080483ec   EFLAGS: 00210286CS: 0073   DS: 007b   ES: 007b   FS: 0000   GS: 0033   SS: 007bTrap: 0000000e   Error: 00000006   OldMask: 00000000ESP/signal: bff69630   CR2: 00000000Backtrace:
/home/wbhuang/src/test_debug_segmentation/main.c:7(test)[0x80483ec]
/home/wbhuang/src/test_debug_segmentation/main.c:13(main)[0x80483f9]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75ab4d3]
??:?(_start)[0x8048311]Memory map:08048000-08049000 r-xp 00000000 08:01 265539 /home/wbhuang/src/test_debug_segmentation/main
08049000-0804a000 r--p 00000000 08:01 265539 /home/wbhuang/src/test_debug_segmentation/main
0804a000-0804b000 rw-p 00001000 08:01 265539 /home/wbhuang/src/test_debug_segmentation/main
081d7000-081fc000 rw-p 00000000 00:00 0 [heap]
b7572000-b758e000 r-xp 00000000 08:01 393937 /lib/i386-linux-gnu/libgcc_s.so.1
b758e000-b758f000 r--p 0001b000 08:01 393937 /lib/i386-linux-gnu/libgcc_s.so.1
b758f000-b7590000 rw-p 0001c000 08:01 393937 /lib/i386-linux-gnu/libgcc_s.so.1
b7590000-b7592000 rw-p 00000000 00:00 0
b7592000-b7735000 r-xp 00000000 08:01 393912 /lib/i386-linux-gnu/libc-2.15.so
b7735000-b7736000 ---p 001a3000 08:01 393912 /lib/i386-linux-gnu/libc-2.15.so
b7736000-b7738000 r--p 001a3000 08:01 393912 /lib/i386-linux-gnu/libc-2.15.so
b7738000-b7739000 rw-p 001a5000 08:01 393912 /lib/i386-linux-gnu/libc-2.15.so
b7739000-b773c000 rw-p 00000000 00:00 0
b774d000-b7750000 r-xp 00000000 08:01 393894 /lib/i386-linux-gnu/libSegFault.so
b7750000-b7751000 r--p 00002000 08:01 393894 /lib/i386-linux-gnu/libSegFault.so
b7751000-b7752000 rw-p 00003000 08:01 393894 /lib/i386-linux-gnu/libSegFault.so
b7752000-b7754000 rw-p 00000000 00:00 0
b7754000-b7755000 r-xp 00000000 00:00 0 [vdso]
b7755000-b7775000 r-xp 00000000 08:01 393890 /lib/i386-linux-gnu/ld-2.15.so
b7775000-b7776000 r--p 0001f000 08:01 393890 /lib/i386-linux-gnu/ld-2.15.so
b7776000-b7777000 rw-p 00020000 08:01 393890 /lib/i386-linux-gnu/ld-2.15.so
bff4b000-bff6c000 rw-p 00000000 00:00 0

参考资料:http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html

转载于:https://www.cnblogs.com/binmaizhai/archive/2013/03/15/2961059.html

几种Linux段错误调试方法相关推荐

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

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

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

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

  3. Linux内存不够调试,Linux系统内存错误调试方法

    而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址. 一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由g ...

  4. linux段错误(Segmentation fault)调试方式

    我们在用C/C++语言写程序的时侯,内存管理的绝大部分工作都是需要我们来做的.实际上,内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难免会在此处犯些小错误,而通常这些错误又是那么的浅显而易于 ...

  5. 段错误调试神器 - Core Dump详解

    一.前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得 ...

  6. Linux段错误-转

    Linux段错误 目录 1.什么是段错误? 2.为什么段错误这么"麻烦"? 3.编程中通常碰到段错误的地方有哪些? 4.如何发现程序中的段错误并处理掉? 正文 1.什么是段错误? ...

  7. C程序查找段错误的方法

    在linux系统中我们写C语言应用程序经常会遇到让编译器不能找出来的错误,它一般在编译后显示为段错误,而段错误不像其它语法错误,编译器会自动提示你错误在哪一行,在这里就不详提出现段错误的原因有哪些,主 ...

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

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

  9. [Linux]core文件调试方法

    来源: shaovey的专栏 在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息).使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行 ...

最新文章

  1. 19、Power Query-快速分析各产品的销售情况
  2. mac 下代码合并比较的工具(changes)
  3. linux c之孤儿进程与僵尸进程[总结]
  4. Service Worker,Web Worker,WebSocket的对比
  5. wps office oa控件 痕迹_WPS加载项案例应用回顾
  6. 图论 —— 生成树 —— 最小生成树 —— Prim
  7. 区块链需要学习哪些东西_区块链主要学习哪些知识?
  8. 如何让路由器摆脱安全困扰
  9. C#图片处理之:最简单的柔化算法
  10. 【leetcode刷题笔记】Roman to Integer
  11. 如何拯救「大泥球」架构?人人车Android客户端架构演进实录
  12. Linux的history命令
  13. html参数转义字符,Html转义字符 获得请求参数
  14. Json格式以及常见的Json解析器
  15. android获取root代码,Android获取ROOT权限的实例代码
  16. 使用Postman进行get、put、post端口测试
  17. uipath sequence传递参数_湛江压铸模温机工作原理参数图
  18. 学计算机有那些方向,计算机专业的研究生研究方向有哪些
  19. android简单的自定义涂鸦控件
  20. 计算机内存错误 要降频,windows10系统出现内存自动降频的解决方法

热门文章

  1. 大型企业网络配置系列课程详解(五) --Frame-Relay配置与相关概念的理解
  2. day 05 python基础
  3. es安装ik后报错无法启动 read write
  4. 002.iSCSI服务端配置
  5. 操作系统(科普章节)
  6. Linux下出现Read-only file system的解决办法
  7. Php开发官方IDE ZEND
  8. TCP 的那些事儿(下)
  9. 四十六、获得SD卡的大小以及内部的文件信息
  10. 网站用户体验的76个体验点