有的程序可以通过编译, 但在运行时会出现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. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!

    InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoD ...

  2. Codeforces 716A Crazy Computer 【模拟】 (Codeforces Round #372 (Div. 2))

    A. Crazy Computer time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  3. 【宽搜】ECNA 2015 D Rings (Codeforces GYM 100825)

    题目链接: http://codeforces.com/gym/100825 题目大意: 给你一张N*N(N<=100)的图表示一个树桩,'T'为年轮,'.'为空,求每个'T'属于哪一圈年轮,空 ...

  4. SCU 4440 Rectangle 2015年四川省赛题

    题目链接:http://acm.scu.edu.cn/soj/problem/4440/ 题目大意:给一个n*m的方格,求周长小于等于k的矩形有多少个. 解题思路:我之前直接暴力,显然超时,所以后来发 ...

  5. 使用Sublime Text搭建python调试环境

    原文地址:http://blog.csdn.net/wenxuansoft/article/details/38559731 pycharmt等IDE虽然用着爽,但毕竟在速度.资源上还是比较让人不爽的 ...

  6. Vagrant网络配置

    Vagrant中网络配置 一.基本配置 Vagrant offers multiple options for how you are able to connect your guest machi ...

  7. SRM 399(1-250pt)

    DIV1 250pt 题意:给出一个size不超过50的数组a和整数n,求x,y,z使得|n - x*y*z|最小,且x,y,z均不再数组a中.若有多组xyz使得|n-x*y*z|最小,输出字典序最小 ...

  8. 跳跃表Skip List【附java实现】

    skip list的原理 Java中的LinkedList是一种常见的链表结构,这种结构支持O(1)的随机插入及随机删除, 但它的查找复杂度比较糟糕,为O(n). 假如我们有一个有序链表如下,如果我们 ...

  9. sl4j记录

  10. xargs 参数

    hadoop fs -ls /source/recommend/at_access | awk -F "/" '{print $NF}' | grep -v $(date +%Y% ...