用core dump来调试程序段错误

有的程序可以通过编译, 但在运行时会出现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.举例:

[html] view plaincopy

  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. [[email protected]_SIM2 mam2cm]#
  11. 就可以利用命令gdb进行查找,参数一是应用程序的名称,参数二是core文件,运行
  12. gdb cmm_test_tool core.19344结果如下:
  13. [[email protected]_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来调试程序段错误,布布扣,bubuko.com

时间: 2024-10-11 19:47:40

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

CORE DUMP生成调试

之前我调试嵌入式linux程序,一般是借助ucontext库,在发生段错误时,直接将错误函数打印出来.有同事建议我使用core dump,于是我今天在嵌入式板卡尝试了core文件的生成,但是也是几经波折,在网上查了很多资料,才成功生成core文件,所以总结如下: 如果程序段错误了,core文件没有生成,请做如下的尝试: 1. 检查ulimit,输入命令ulimit-c,看是否是0:建议修改成:ulimit -c unlimited 2. 检查kernel选项,CONFIG_ELF_CORE必须要

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

原作者:http://blog.csdn.net/wj_j2ee/article/details/7161586 1. 内核转储作用 (1) 内核转储的最大好处是能够保存问题发生时的状态. (2) 只要有可执行文件和内核转储,就可以知道进程当时的状态. (3) 只要获取内核转储,那么即使没有复现环境,也能调试. 2. 启用内核转储 1.1 查看内核转储是否有效 在终端中输入以下命令,查看内核转储是否有效. #ulimit -c 0 -c 表示内核转储文件的大小限制,现在显示为零,表示不能用. 可

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

一.前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得困难起来. gdb: 有一种办法是, 我们用gdb的step, 一步一步寻找. 这放在短小的代码中是可行的, 但要让你step一个上万行的代码, 我想你会从此厌恶程序员这个名字, 而把他叫做调试员. 我们还有更好的办法, 这就是core file. ulimit: 如果想让系统在信号中断造成的错误时

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

from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联网 作者:Alex 时间:2013-07-08 Tag:Linux   点击: 11670 一.前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得困难起来

什么是core dump linux下用core和gdb查询出现"段错误"的地方

什么是core dump   linux下用core和gdb查询出现"段错误"的地方 http://blog.chinaunix.net/uid-26833883-id-3193279.html 有些时候我们在一段C代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了"段错误". 呵呵,这种问题我想很多人会经常遇到.遇到这种问题是非常无语的,只是提示了"段错误",接着什么都没 有,如果我们一味的去看代码找太疼苦了,因为我们都相信自

Core Dump 调试方法

今天调试一个程序, 用到了core dump, 于是写出来, 记于此.什么是Core Dump?Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时,

Linux core dump 分析及相关调试

core是core dump文件,是linux服务器的一种机制.core是个程序的严重问题,会致使程序直接挂掉,需要恢复. 需要注意的东西 在程序挂掉的过程中,会纪录程序的内存信息和cpu调用堆栈信息,当程序占用大量内存的时候,比如40G,那core文件可能会达到60G多,那写文件会持续数十分钟,这么长时间流量都会损失,并且写大文件对wio的占用特别大,严重影响本台服务器的其他服务,对于在线服务,会用很多超时,或者严重的是一段时间无法提供服务.所以,core文件监控,大小控制也很重要. 产生的原

【调试】Core Dump是什么?Linux下如何正确永久开启?

内容简介 [调试]Core Dump是什么?Linux下如何正确永久开启? Core Dump是什么?Linux下如何正确永久开启? Core Dump是什么? Core Dump乍听之下很抽象. 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成"核心转储"). 我们可以认为Core Dump是"内存快照",但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时dump

段错误Segment Fault定位,即core dump文件与gdb定位

使用C++开发系统有时会出现段错误,即Segment Fault.此类错误程序直接崩溃,通常没有任何有用信息输出,很难定位bug,因而无从解决问题.今天我们介绍core dump文件,并使用gdb进行调试,以此来定位段错误问题.此文同时用以备忘. 一.core dump Core dump也称核心转储, 当程序运行过程中异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 称之为core dump文件. 系统默认不生成core dump文件,可以使用ulimit命令进行查看和设