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

1.在一般Linux系统中,默认是不会产生core dump文件的。通过ulimit -c来查看core dump文件的大小,一般开始是0。
    可以设置core文件大小,ulimit -c 1024(kbytes单位)或者ulimit -c unlimited。(注: 使用-c unlimited不限制core文件大小)
2.生成core文件: $ sudo  sh -c "ulimit -c unlimited; ./main_arm" # main_arm 是可执行文件名。
3.记得在编译时加上 -g 方便调试,注意不要加上优化选项 -Os(或者-O0 -O1 ....)
4.用gdb查看core文件:
    gdb [exec file] [core file]
    如:gdb main_arm core
    在进入gdb后, 用 bt 或 where 命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件行.
5.举例:

  1. 一个程序cmm_test_tool在运行的时候发生了错误,并生成了一个core文件,如下:
  2. -rw-r–r– 1 root cmm_test_tool.c
  3. -rw-r–r– 1 root cmm_test_tool.o
  4. -rwxr-xr-x 1 root cmm_test_tool
  5. -rw——- 1 root core.19344
  6. -rw——- 1 root core.19351
  7. -rw-r–r– 1 root cmm_test_tool.cfg
  8. -rw-r–r– 1 root cmm_test_tool.res
  9. -rw-r–r– 1 root cmm_test_tool.log
  10. [root@AUTOTEST_SIM2 mam2cm]#
  11. 就可以利用命令gdb进行查找,参数一是应用程序的名称,参数二是core文件,运行
  12. gdb cmm_test_tool core.19344结果如下:
  13. [root@AUTOTEST_SIM2 mam2cm]# gdb cmm_test_tool core.19344
  14. GNU gdb Red Hat Linux (5.2.1-4)
  15. Copyright 2002 Free Software Foundation, Inc.
  16. GDB is free software, covered by the GNU General Public License, and you are
  17. welcome to change it and/or distribute copies of it under certain conditions.
  18. Type “show copying” to see the conditions.
  19. There is absolutely no warranty for GDB. Type “show warranty” for details.
  20. This GDB was configured as “i386-redhat-linux”…
  21. Core was generated by `./cmm_test_tool’.
  22. Program terminated with signal 11, Segmentation fault.
  23. Reading symbols from /lib/i686/libpthread.so.0…done.
  24. Loaded symbols for /lib/i686/libpthread.so.0
  25. Reading symbols from /lib/i686/libm.so.6…done.
  26. Loaded symbols for /lib/i686/libm.so.6
  27. Reading symbols from /usr/lib/libz.so.1…done.
  28. Loaded symbols for /usr/lib/libz.so.1
  29. Reading symbols from /usr/lib/libstdc++.so.5…done.
  30. Loaded symbols for /usr/lib/libstdc++.so.5
  31. Reading symbols from /lib/i686/libc.so.6…done.
  32. Loaded symbols for /lib/i686/libc.so.6
  33. Reading symbols from /lib/libgcc_s.so.1…done.
  34. Loaded symbols for /lib/libgcc_s.so.1
  35. Reading symbols from /lib/ld-linux.so.2…done.
  36. Loaded symbols for /lib/ld-linux.so.2
  37. Reading symbols from /lib/libnss_files.so.2…done.
  38. Loaded symbols for /lib/libnss_files.so.2
  39. #0 0×4202cec1 in __strtoul_internal () from /lib/i686/libc.so.6
  40. (gdb)
  41. 进入gdb提示符,输入where,找到错误发生的位置和堆栈,如下:
  42. (gdb) where
  43. #0 0×4202cec1 in __strtoul_internal () from /lib/i686/libc.so.6
  44. #1 0×4202d4e7 in strtoul () from /lib/i686/libc.so.6
  45. #2 0×0804b4da in GetMaxIDFromDB (get_type=2, max_id=0×806fd20) at cmm_test_tool.c:788
  46. #3 0×0804b9d7 in ConstrctVODProgram (vod_program=0×40345bdc) at cmm_test_tool.c:946
  47. #4 0×0804a2f4 in TVRequestThread (arg=0×0) at cmm_test_tool.c:372
  48. #5 0×40021941 in pthread_start_thread () from /lib/i686/libpthread.so.0
  49. (gdb)

至此,可以看出文件出错的位置是函数 GetMaxIDFromDB ,两个参数分别是2和0×806fd20,这个函数位于源代码的788行,基于此,我们就可以有针对性的找到问题的根源,并加以解决

用core dump来调试程序段错误的更多相关文章

  1. CORE DUMP生成调试

    之前我调试嵌入式linux程序,一般是借助ucontext库,在发生段错误时,直接将错误函数打印出来.有同事建议我使用core dump,于是我今天在嵌入式板卡尝试了core文件的生成,但是也是几经波 ...

  2. core dump gdb调试

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

  3. linux (core dump)调试

    转自 http://www.cnblogs.com/hazir/p/linxu_core_dump.html Linux Core Dump 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内 ...

  4. linux ulimit的使用,如何产生core文件,调试段错误

    ---恢复内容开始--- 下面先简单介绍下ulimit命令: 1. limit -a 可以查看系统各种资源的限制,如: core文件大小,数据段的大小等. $ ulimit -a core file ...

  5. 在Linux上利用core dump和GDB调试segfault

    时常会遇到段错误(segfault),调试非常费劲,除了单元测试和基本测试外,有些时候是在在线环境下,没有基本开发和测试工具,这就需要调试的技能.以前介绍过使用strace进行系统调试和追踪<l ...

  6. 关于内核转储(core dump)的设置方法

    原作者:http://blog.csdn.net/wj_j2ee/article/details/7161586 1. 内核转储作用 (1) 内核转储的最大好处是能够保存问题发生时的状态. (2) 只 ...

  7. 什么是core dump?(转)

    什么是Core Dump? 今天调试一个程序, 用到了core dump, 于是写出来, 记于此.什么是Core Dump?Core的意思是内存, Dump的意思是扔出来, 堆出来.开 发和使用Uni ...

  8. 【转】段错误调试神器 - Core Dump详解

    from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...

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

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

随机推荐

  1. WebService引擎Axis2完美教程

    1.http://wenku.baidu.com/link?url=O05r69TGaLmrJrjJqGz-5EASox8FhhUO6i97xoUOV2dcbh8BEnOlX2EN3nuYGE_3HE ...

  2. mangos搭建

    github地址:https://github.com/mangos/MaNGOS MaNGOS 是( Massive Network Game Object Server) 的缩写.由于暴雪公司对类 ...

  3. 服务器端打开office然后采用虚拟打印 转换成pdf

    服务器端打开office然后采用虚拟打印 转换成pdf [WebMethod] public bool ConvertWordTOPDF(string WordPath) { bool ret=fal ...

  4. 图论(无向图的割顶):POJ 1144 Network

    Network   Description A Telephone Line Company (TLC) is establishing a new telephone cable network. ...

  5. 如何在Sqlserver2000查询分析器中,,在一个库中调用另一个数据库中的数据表

    同一服務器 use aa select * from pubs.dbo.jobs 不同服務器 select * from openrowset('sqloledb','IP地址';'sa';'密碼', ...

  6. 高效算法——A 归并排序

    In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a seque ...

  7. word 2010中如何创建多级目录和多级列表

    原文地址:http://wenku.baidu.com/link?url=KkSmYTqogxA5VJkLCGb957E5fIGN5S50FUx7IpAWWWKWWRYvaeGl2IvX-dFP25r ...

  8. python 解析xml 文件: SAX方式

    环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...

  9. [置顶] 步步辨析JS中的对象成员

    前提 首先我们应该明白创建一个JS对象的具体实例是实例化的过程,而实例化是通过new关键字实现的,这个对象是含有constructor的,一般的核心对象都会具有constructor以便创建其实例.因 ...

  10. C#构造函数里的base和this的区别

    用法一: 父类的构造函数总是在子类之前执行的.既先初始化静态构造函数,后初始化子类构造函数. public class BaseCircle { public BaseCircle() { Conso ...