有的程序可以通过编译, 但在运行时会出现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. 基于Node.js的强大爬虫 能直接发布抓取的文章哦

    基于Node.js的强大爬虫 能直接发布抓取的文章哦 基于Node.js的强大爬虫能直接发布抓取的文章哦!本爬虫源码基于WTFPL协议,感兴趣的小伙伴们可以参考一下 一.环境配置 1)搞一台服务器,什 ...

  2. [Poetize II]七夕祭

    描述 Description TYVJ七夕祭和11区的夏祭的形式很像.矩 形的祭典会场由N排M列共计N×M个摊点组成.虽然摊点种类繁多,不过cl只对其中的一部分摊点感兴趣,比如章鱼烧.苹果糖.棉花糖. ...

  3. (转载)提高mysql插入数据的速度

    (转载)http://blog.csdn.net/bhq2010/article/details/7376352 需要在mysql中插入2000万条记录,用insert语句插入速度很有限,每秒钟几百条 ...

  4. Azkaban2配置过程

    Azkaban2配置过程 azkaban2所需环境:jdk1.6.ant.jetty.hadoop.ssl证书 通过http://azkaban.github.io/azkaban2/download ...

  5. Craking the coding interview 面试题:完美随机洗牌

    给定一个序列,随机打乱这个序列,新产生的序列和任意一个序列产生的可能性是一样的,就是所谓的完美随机洗牌. 看下面的运行结果: 上面第一列是原数列,下面一行是新产生的打乱的数列. 基本思想:如果n-1个 ...

  6. solr 在windows下的安装

    安装环境 Windows 7 64bit Apache-tomcat-8.0.9-windows-x64 Solr-4.9.0 JDK 1.8.0_05 64bit 安装步骤 Tomcat和JDk的安 ...

  7. 小学生玩ACM----深搜

    Square Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  8. cocos2d-x项目过程记录(纹理和内存优化方面)

    1.参考资料:Cocos2d-x纹理优化的一些方案  cocos2d-x如何优化内存的应用  iOS和android游戏纹理优化和内存优化(cocos2d-x) 2.加载贴图集纹理 CCSpriteF ...

  9. 用crontab设置svn的定期更新任务

    本以为用crontab设置svn的定期更新任务是件非常容易的事情,实践后方才知道,其实并不那么容易.设置例行性工作如下:0 8 * * * /usr/bin/svn up /data/test第二天, ...

  10. PHP: 深入pack/unpack <转> [链接]

    PHP: 深入pack/unpack PHP: chr和pack.unpack那些 PHP: pack/unpack补遗