用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.举例:
- 一个程序cmm_test_tool在运行的时候发生了错误,并生成了一个core文件,如下:
- -rw-r–r– 1 root cmm_test_tool.c
- -rw-r–r– 1 root cmm_test_tool.o
- -rwxr-xr-x 1 root cmm_test_tool
- -rw——- 1 root core.19344
- -rw——- 1 root core.19351
- -rw-r–r– 1 root cmm_test_tool.cfg
- -rw-r–r– 1 root cmm_test_tool.res
- -rw-r–r– 1 root cmm_test_tool.log
- [root@AUTOTEST_SIM2 mam2cm]#
- 就可以利用命令gdb进行查找,参数一是应用程序的名称,参数二是core文件,运行
- gdb cmm_test_tool core.19344结果如下:
- [root@AUTOTEST_SIM2 mam2cm]# gdb cmm_test_tool core.19344
- GNU gdb Red Hat Linux (5.2.1-4)
- Copyright 2002 Free Software Foundation, Inc.
- GDB is free software, covered by the GNU General Public License, and you are
- welcome to change it and/or distribute copies of it under certain conditions.
- Type “show copying” to see the conditions.
- There is absolutely no warranty for GDB. Type “show warranty” for details.
- This GDB was configured as “i386-redhat-linux”…
- Core was generated by `./cmm_test_tool’.
- Program terminated with signal 11, Segmentation fault.
- Reading symbols from /lib/i686/libpthread.so.0…done.
- Loaded symbols for /lib/i686/libpthread.so.0
- Reading symbols from /lib/i686/libm.so.6…done.
- Loaded symbols for /lib/i686/libm.so.6
- Reading symbols from /usr/lib/libz.so.1…done.
- Loaded symbols for /usr/lib/libz.so.1
- Reading symbols from /usr/lib/libstdc++.so.5…done.
- Loaded symbols for /usr/lib/libstdc++.so.5
- Reading symbols from /lib/i686/libc.so.6…done.
- Loaded symbols for /lib/i686/libc.so.6
- Reading symbols from /lib/libgcc_s.so.1…done.
- Loaded symbols for /lib/libgcc_s.so.1
- Reading symbols from /lib/ld-linux.so.2…done.
- Loaded symbols for /lib/ld-linux.so.2
- Reading symbols from /lib/libnss_files.so.2…done.
- Loaded symbols for /lib/libnss_files.so.2
- #0 0×4202cec1 in __strtoul_internal () from /lib/i686/libc.so.6
- (gdb)
- 进入gdb提示符,输入where,找到错误发生的位置和堆栈,如下:
- (gdb) where
- #0 0×4202cec1 in __strtoul_internal () from /lib/i686/libc.so.6
- #1 0×4202d4e7 in strtoul () from /lib/i686/libc.so.6
- #2 0×0804b4da in GetMaxIDFromDB (get_type=2, max_id=0×806fd20) at cmm_test_tool.c:788
- #3 0×0804b9d7 in ConstrctVODProgram (vod_program=0×40345bdc) at cmm_test_tool.c:946
- #4 0×0804a2f4 in TVRequestThread (arg=0×0) at cmm_test_tool.c:372
- #5 0×40021941 in pthread_start_thread () from /lib/i686/libpthread.so.0
- (gdb)
至此,可以看出文件出错的位置是函数 GetMaxIDFromDB ,两个参数分别是2和0×806fd20,这个函数位于源代码的788行,基于此,我们就可以有针对性的找到问题的根源,并加以解决
用core dump来调试程序段错误的更多相关文章
- CORE DUMP生成调试
之前我调试嵌入式linux程序,一般是借助ucontext库,在发生段错误时,直接将错误函数打印出来.有同事建议我使用core dump,于是我今天在嵌入式板卡尝试了core文件的生成,但是也是几经波 ...
- core dump gdb调试
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIG ...
- linux (core dump)调试
转自 http://www.cnblogs.com/hazir/p/linxu_core_dump.html Linux Core Dump 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内 ...
- linux ulimit的使用,如何产生core文件,调试段错误
---恢复内容开始--- 下面先简单介绍下ulimit命令: 1. limit -a 可以查看系统各种资源的限制,如: core文件大小,数据段的大小等. $ ulimit -a core file ...
- 在Linux上利用core dump和GDB调试segfault
时常会遇到段错误(segfault),调试非常费劲,除了单元测试和基本测试外,有些时候是在在线环境下,没有基本开发和测试工具,这就需要调试的技能.以前介绍过使用strace进行系统调试和追踪<l ...
- 关于内核转储(core dump)的设置方法
原作者:http://blog.csdn.net/wj_j2ee/article/details/7161586 1. 内核转储作用 (1) 内核转储的最大好处是能够保存问题发生时的状态. (2) 只 ...
- 什么是core dump?(转)
什么是Core Dump? 今天调试一个程序, 用到了core dump, 于是写出来, 记于此.什么是Core Dump?Core的意思是内存, Dump的意思是扔出来, 堆出来.开 发和使用Uni ...
- 【转】段错误调试神器 - Core Dump详解
from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...
- 段错误调试神器 - Core Dump详解
一.前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得 ...
随机推荐
- 在线LCA模板
在线LCA 如求A,B两点的LCA,先计算出各个结点的深度d[],然后,通过递推公式求出各个结点的2次方倍的祖先p[],假设d[A] > d[B],则找到d[p[A][i]] == d[B]也就 ...
- Visual Studio Code尝试体验
背景了解 偶然间看到一篇大赞Visual Studio Code的文章,就搜索了一下,发现网上基本一致的好评.虽然微软在2015年4月29号 Build 2015 大会上才发布,但免费,轻量,跨平台版 ...
- (转载)Linux定时任务cron配置
(转载)http://blog.csdn.net/jbgtwang/article/details/7995801 实现linux定时任务有:cron.anacron.at等,这里主要介绍cron服务 ...
- Delhpi TdxComponentPrinter怎样联上dxdbgrid中的数据打印
有谁知道TdxComponentPrinter怎样联上dxdbgrid中的数据打印? 有谁知道TdxComponentPrinter怎样联上dxdbgrid中的数据打印? 回复人: ...
- 福州大学 Problem 2168 防守阵地 I
http://acm.fzu.edu.cn/problem.php?pid=2168 最重要的是 dp[k]=dp[k-1]-ans[k-1]+x[i]*m; ans[k-1]是m个数求和. Pro ...
- QT5.7.0在win10下使用visual studio 2015编译(目标平台 xp)
环境:win10+vs2015+QT5.7.0 目标:编译出能在windows xp上运行的QT 通过baidu和bing找出来的结果没有一个能成功运行,大部分都能编译成功,并完美解决“exe不是有效 ...
- 用document.getElementsByTagName()返回的真的是数组吗?
document.getElementsByTagName()返回的真的是数组吗? 这是这几天开发中遇到的问题. 一个如下的HTML结构: <ul> <li> <li&g ...
- 《A First Course in Probability》-chaper8-极限定理-切比雪夫不等式
基于对概率问题的抽象化,通过期望.方差.随机变量X及其概率,我们想要通过几个量推出另外几个量的特征,笼统的来说,极限定理起到的作用便在于此 切比雪夫不等式: 在证明切比雪夫不等式之前,我们先要完成对马 ...
- Java中this的功能与作用
粗粒度上来说,Java中关键字this主要有2个功能: 1.表示“当前对象”的引用 (1)作为参数传入 [程序实例1] public class MyObject { public Integer v ...
- 【Java】Java8新增的Lambda表达式_学习笔记
一.Lambda表达式可以简化创建匿名内部类对象 1.不需要new XXX(){}这种繁琐代码. 2.不需要指出重写的方法名. 3.不要给出重写的方法的返回值类型. 4.Lambda相当于一个匿名方法 ...