在Linux下程序崩溃,特别是在循环中产生Segment Fault错误时,根本不知道程序在哪出错,这时,利用core文件可以快速找到出错的问题所在。

#@author:       gr
#@date: 2015-05-27
#@email: forgerui@gmail.com

一、core文件的产生

有时候程序崩溃并没有产生core文件,这时需要设置core文件大小。

1.1. 查看core文件大小

如果core文件大小为0,就不会产生core文件。

ulimit -a 		#查看所有大小
ulimit -c #查看core文件大小

1.2. 设置core文件大小

ulimit -c 1024			#设为1024
ulimit -c unlimited #设置成不受限制

如果想永久修改大小,可以修改/etc/security/limits.conf,设置如下:

#<domain>      <type>  <item>         <value>
* hard core unlimited

1.3. core文件的命名

如果将/proc/kernel/core_uses_pid设置为1,表示添加pid作为扩展名,core文件形式如core.3871。为0,则生成的文件同一命名成core,这样可能会覆盖掉同一文件名。

二、core文件使用

使用gdb可以查看出错时的堆栈信息。

gdb -c core exe(运行文件名)
bt #查看出错时的堆栈信息
where #和bt相似 #0 0x00007fef3232a267 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:55
#1 0x00007fef3232beca in __GI_abort () at abort.c:89
#2 0x00007fef32c3e06d in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x00007fef32c3bee6 in () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4 0x00007fef32c3bf31 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5 0x00007fef32c3c149 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6 0x00007fef3411ba5a in cv::error(cv::Exception const&) () from /usr/local/lib/libopencv_core.so.2.4
#7 0x00007fef34218a84 in cv::Mat::Mat(cv::Mat const&, cv::Rect_<int> const&) () from /usr/local/lib/libopencv_core.so.2.4
#8 0x0000000000409adb in cv::Mat::operator() (this=0x7ffd19b49020, roi=...) at /usr/local/include/opencv2/core/mat.hpp:379
#9 0x000000000041372a in EnsembleTracker::drawResult (this=0x1e1af90, frame=..., frameClone=..., scale=1) at tracker.h:107
#10 0x00000000004122ba in TrakerManager::doWork (this=0x7ffd19b49880, frame=..., frame2=...) at multiTrackAssociation.cpp:762
#11 0x0000000000405310 in multiTrack (readerType=0, detectorType=1) at main.cpp:174
#12 0x00000000004059f5 in main (argc=3, argv=0x7ffd19b49bd8) at main.cpp:246

由于程序中使用了opencv,发现在程序出错时报错的信息比较多。我们可以看到在#9之后就是自己的代码,#8之前的代码是其它程序实现的,出错的位置在tracker.h的107行,再根据出错时候的输出信息:

OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) in Mat, file /home/grlab/app/opencv-2.4.9/modules/core/src/matrix.cpp, line 323
terminate called after throwing an instance of 'cv::Exception'
what(): /home/grlab/app/opencv-2.4.9/modules/core/src/matrix.cpp:323: error: (-215) 0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows in function Mat

可知程序的问题应该是没有进行MatRect检查,Rect的位置超越了Mat的大小,只要与Mat的大小相与一下就可以解决了。

rect &= Rect(0, 0, imgMat.cols, imgMat.rows);
Mat roiMat = imgMat(rect);

三、Reference

  1. http://www.cnblogs.com/li-hao/archive/2011/09/25/2190278.html
  2. http://blog.sina.com.cn/s/blog_537f4d9b0100wi88.html
  3. http://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328355.html

### core文件使用的更多相关文章

  1. core文件

    1.ulimit  -c查看是否可以产生core文件 打印0表示当前不产生core文件 2.ulimit -c unlimited 设置产生core文件 这种方法只是临时设置产生core文件 3.ec ...

  2. Core文件作用、设置及用法

    http://blog.csdn.net/lanmolei814/article/details/45201693 ====================================== 1.C ...

  3. jexus防止产生 *.core文件

    1. jexus防止产生 *.core文件 # vi jws 新增: ulimit -c 0 >/dev/null 2>&1 2.删除*.core # sudo rm -rf *. ...

  4. 开发板上使用core文件调试

    转载:http://www.nginx.cn/1521.html 如果开发板的操作系统也是linux,core调试方法依然适用.如果开发板上不支持gdb,可将开发板的环境(依赖库).可执行文件和cor ...

  5. 让linux中的程序崩溃时生成core文件

    当我们的linux程序崩溃的时候,常常会有这样的提示:    Segmentation fault (core dumped)    段错误 (核心已转储)    提示说生成了core文件,但是此功能 ...

  6. Linux中如何产生core文件?

      在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息).使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数.   1.core文件 ...

  7. Linux core 文件介绍

    Linux core 文件介绍 http://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328355.html 1. core文件的简单介绍在一个 ...

  8. linux包之gdb之gdb命令与core文件产生

    gdb-7.2-64.el6_5.2.x86_64/usr/bin/gcore/usr/bin/gdb/usr/bin/gdb-add-index/usr/bin/gdbtui/usr/bin/gst ...

  9. gdb简单调试~core文件

    1.打开终端,进入项目目录,输入ulimit -a ,可以看core文件大小设置(第一行),若为0, 则没有打开core dump设置. 2.ulimit -c unlimited ,core文件大小 ...

随机推荐

  1. 如何计算ModBus超时时间?

    波特率:每秒钟通过信道传输的信息量称为位传输速率,也就是每秒钟传送的二进制位数,简称比特率.比特率表示有效数据的传输速率,用b/s .bit/s.比特/秒,读作:比特每秒. 如9600b/s:指总线上 ...

  2. ECshop模板机制

    ECshop模板机制整理 模板机制 近期新项目涉及到ECshop的二次开发,趁此良机正好可以对闻名已久的ECshop系统进行深入了解.要了解一个系统,那么该系统的模板机制就是最重要的一环.相关整理如下 ...

  3. 【转】MyEclipse8.5集成Tomcat7时的启动错误:Exception in thread “main” java.lang.NoClassDefFoundError org/apache/commons/logging/LogFactory

    http://www.cnblogs.com/newsouls/p/4021198.html 今天,安装Tomcat7.0.21后,单独用D:\apache-tomcat-7.0.21\bin\sta ...

  4. Process学习

    主要系统总结下我对进程的认识,以前理解得不够全面不够深入.本文肯定还不够好,当有新的认识新的理解后还会随时来更新.读完本文,下面几个问题便可理解清楚. 1.进程是什么? 2.为什么要有进程这个概念? ...

  5. Android 编程下 java.lang.NoClassDefFoundError: cn.jpush.android.api.JPushInterface 报错

    使用了极光推送的 jar 包项目在从 SVN 中检出后,假设不又一次对 jar 包和 Bulid Path 进行配置就会抛出 java.lang.NoClassDefFoundError: cn.jp ...

  6. Linux上安装JDK环境变量配置

    http://blog.chinaunix.net/uid-12115233-id-3304951.html Jdk: jdk-6u1-linux-i586 Tomcat: apache-tomcat ...

  7. Hibernate连接MySQL数据库乱码相关问题

    1.查看MySQL字符编码 >show variables like 'character%'; #执行编码显示 其中character_set_client,character_set_res ...

  8. .Net 与 Java 的服务接口相互调用

    本文介绍.Net 与 Java 相互调用的例子.下面的介绍主要包括三方面:一是通过常用Web服务进行相互调用,二是使用TCP/IP套接字进行相互调用,三是使用Remote实现远程对象相互调用. 首先说 ...

  9. oracle11g密码大小写敏感问题

    密码大小写敏感是Oracle 11g数据库默认的一个新特性,数据库配置助手(DBCA)在创建数据库期间允许你将这个设置返回到11g以前的功能. SEC_CASE_SENSITIVE_LOGON初始化参 ...

  10. python--字典工厂函数dict()

    dic = {"name" : "wangmo" ,"age" : 18} #dic.clear() #清空字典 print(dic) #{ ...