linux下core文件生成及调试方法

【core】设置core大小遇到-bash: ulimit: core file size: cannot modify limit: Operation not permitted 设置core大小遇到-bash: ulimit: core file size: cannot modify limit: Operation not permitted 阅读详情

在程序发现段错误等不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息,编译时加了-g参数)。使用gdb查看生成的core文件,可以很容易找出导致程序出错的代码所在的文件和行数。

1、linux系统下生成及调试core文件

  1.1 开启core文件并设置其大小

  1.1.1)使用ulimit -c命令,如果结果为0,则表示没有开启此功能,即不会生成core文件;如果结果不为unlimited,则表示core文件大小不受限制;如果结果coresize(除了上述两种结果),则说明指定core文件大小为coresize KB。

  1.1.2) 使用ulimit -c coresize命令,设置core文件的大小为coresize(单位为KB);使用ulimit -c unlimited,设置core文件的大小不受限制,如果生成的core文件超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文件的时候,gdb会提示错误。

       注意:很多系统默认的core文件大小都是0,我们可以通过在shell的启动脚本/etc/bashrc、~/.bashrc或者/etc/profile等地方来加入 ulimit -c 命令来指定core文件大小,从而确保core文件能够生成,在编译的时候需要加-g参数,core文件才能正常显示出错误信息,有时候core信息很大,超出了剩余的空间,从而造成生成的core文件不全(开发板上可以通过挂载来规避这一点)。

  1.2 core文件的名称和生成路径

  core文件生成路径:

  若系统生成的core文件不带任何扩展名称,则全部命名为core,新的core文件生成将覆盖原来的core文件。

  1.2.1) /proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展名。文件内容为1,表示添加pid作为扩展名,生成的core文件名为core.xxxx;文件内容为0,则表示生成的core文件统一命名为core。

  可通过以下命令来修改该文件:

  echo "1" > /proc/sys/kernel/core_uses_pid


  1.2.2) proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。

  可通过以下命令来修改该文件:

  echo "/corefile/core-%e-%p-%t" > core_pattern,可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳

  以下是参数列表:

  %p - insert pid into filename                                                                  插入当前的pid

  %u - insert current uid into filename                                                      插入当前的uid

  %g - insert current gid into filename                                                      插入当前的gid

  %s - insert signal that caused the coredump into the filename             插入导致产生core文件的信号

  %t - insert UNIX time that the coredump occurred into filename          插入core文件生成时的时间

  %h - insert hostname where the coredump happened into filename    插入主机名

  %e - insert coredumping executable name into filename                     插入程序名

 

    我们还可以通过以下命令来设置:

  sysctl -w kernel.core_pattern=/tmp/core-%e-%p,这些操作一旦计算机重启,则会丢失,如果你想持久化这些操作,可以在 /etc/sysctl.conf文件中增加:kernel.core_pattern=/tmp/core%p,并且可以执行命令:sysctl -p /etc/sysctl.conf使修改立即生效。

 

  1.3 使用gdb来查看core文件

  # gdb test.exe

       ......
       (gdb) core-file core.7209

 

  使用bt或者where命令查看程序出错的地方。

  以下两种命令方式具有相同的效果,但是在有些环境简写和省略参数无效,所以推荐使用上面的命令。

  1.3.1)gdb test.exe -c core.7209

       1.3.2)gdb test.exe -core=core.7209

    (gdb) bt
       #0  0x080483df in main () at core.c:19
       (gdb) where
       #0  0x080483df in main () at core.c:19

  

       1.4 先看一段在linux系统中会造成段错误的程序:

        #include <stdio.h>

        int main()

       {

             char *ptr = NULL;
            *ptr= 5;
            return 0;
      }


  编译运行后结果如下:

       root@lb:~/WorkRoom/Practice# gcc core.c -g -o test.exe
       root@lb:~/WorkRoom/Practice# ./test.exe

       段错误

  此时并没有产生core文件,接下来使用ulimit -a或者ulimit -c查看core文件的大小,然后使用ulimit -c unlimited设置将core文件设置为无限制,再执行./test.exe程序,结果如下:

       root@lb:~/WorkRoom/Practice# ulimit -a
       core file size          (blocks, -c) 0

       ……

       root@lb:~/WorkRoom/Practice# ulimit -c unlimited
       root@lb:~/WorkRoom/Practice# ulimit -a
       core file size          (blocks, -c) unlimited

       ……

       root@lb:~/WorkRoom/Practice# ./test.exe
       段错误 (core dumped)

       root@lb:~/WorkRoom/Practice# ll core.*
       -rw------- 1 root root 151552 07-10 04:22 core.7209
       -rw-r--r-- 1 root root    692 07-10 04:22 core.c

  可见core文件已经生成,接下来可以用gdb分析,查看堆栈情况:

       root@lb:~/WorkRoom/Practice# gdb test.exe
       GNU gdb Fedora (6.8-1.fc9)
       Copyright (C) 2008 Free Software Foundation, Inc.
       License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
       This is free software: you are free to change and redistribute it.
       There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
       and "show warranty" for details.
       This GDB was configured as "i386-redhat-linux-gnu"...
       (gdb) core-file core.7209
       warning: core file may not match specified executable file.
       warning: Can't read pathname for load map: Input/output error.
       Reading symbols from /lib/libc.so.6...done.
       Loaded symbols for /lib/libc.so.6
       Reading symbols from /lib/ld-linux.so.2...done.
       Loaded symbols for /lib/ld-linux.so.2
       Core was generated by `./aa'.
       Program terminated with signal 11, Segmentation fault.
       [New process 7209]
       #0  0x080483df in main () at core.c:19
      19          *ptr= 5;
      Missing separate debuginfos, use: debuginfo-install glibc.i686
      (gdb) where
      #0  0x080483df in main () at core.c:19
      (gdb) bt
      #0  0x080483df in main () at core.c:19
      (gdb)

  从上述输出可以清楚的看到,段错误出现在core.c的第19行,问题已经清晰地定位到了。

  

 

2、开发板上(linux系统)生成及调试core文件 

       2.1 开启core文件并设置其大小

       同1.1

 

       2.2 core文件的名称和生成路径

       同1.2

 

 

    2.3 pc上调试开发板上生成的core文件

  如果开发板的操作系统也是linux,core调试的方法依然适用。如果开发板上不支持gdb,可将开发板的环境(依赖库)、可执行文件和core文件拷贝到PC的linux下,在 PC上调试开发板上产生的core文件,需要使用交叉编译器自带的gdb,并且需要在gdb中指定solib-absolute-prefix和 solib-search-path两个变量以保证gdb能够找到可执行程序的依赖库路径。有一种建立配置文件的方法,不需要每次启动gdb都手动配置以上变量,即:在待运行gdb的路径下建立 .gdbinit。

       配置文件(.gdbinit)内容如下:
          set solib-absolute-prefix /dev/null/
          set solib-search-path /YOUR_PATH1/lib:/YOUR_PATH2/lib

      gdb设置如下:    
          (gdb) set solib-absolute-prefix /dev/null/

          (gdb) set solib-search-path /YOUR_PATH1/lib:/YOUR_PATH2/lib

          (gdb) show solib-absolute-prefix
          The current system root is "/YOUR_PATH1/lib:/YOUR_PATH2/lib".
          (gdb) show solib-search-path
          The search path for loading non-absolute shared library symbol files is /YOUR_PATH1/lib:/YOUR_PATH2/lib.
          (gdb)


      变量说明如下:

          solib-absolute-prefix :设置查找共享库的前缀,作为查找so库路径的前缀;

          solib-search-path :设置so库的查找路径,它是在根据solib-absolute-prefix 查找库失败后使用

 

       2.4 看一段在hisi3716M开发板上的一段会出现段错误的程序

           void TestSegFault(void)
           { 
                  char *ptr = NULL;
                  *ptr=5;
           }

      

           编译运行后结果:

           # ./test.exe
            ROCME malloc size : 28
            ---Info >[DRIVER]:[DRV_OS_MutexCreate]DRV_NO_ERROR
            Segmentation fault (core dumped)

            #

            可见core文件已经生成,接下来可以用交叉编译器来分析,查看堆栈情况:

            root@lb:~/WorkRoom/LocalProject/xxx# arm-hisiv200-linux-gdb test.exe
            GNU gdb (Hisilicon_v200(gcc4.4-290+glibc-2.11+eabi+nptl)) 7.0.50.20100218-cvs
            Copyright (C) 2010 Free Software Foundation, Inc.
            License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
            This is free software: you are free to change and redistribute it.
            There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
            and "show warranty" for details.
            This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-hisiv200-linux-gnueabi".
            For bug reporting instructions, please see:
            <http://www.hisilicon.com/cn/service/claim.html>...
            Reading symbols from /root/WorkRoom/LocalProject/xxx/test.exe...done.
            (gdb) core-file core 
            warning: core file may not match specified executable file.
            [New Thread 937]
            Reading symbols from /YOUR_PATH1/lib:/YOUR_PATH1/libpthread.so.0...(no debugging symbols found)...done.
            Loaded symbols for /YOUR_PATH1/lib:/YOUR_PATH2/lib/libpthread.so.0

            ......
            Loaded symbols for /YOUR_PATH1/lib:/YOUR_PATH2/lib/ld-linux.so.3
            Core was generated by `./test.exe'.
            Program terminated with signal 11, Segmentation fault.
            #0  0x00015040 in main (argc=1, argv=0xbeb6fe24) at main.c:1142
            1142            *ptr=5;
            (gdb) l
            1137    }
            1138
            1139    int main(int argc, char *argv[])
            1140    {
            1141            char *ptr = NULL;
            1142            *ptr=5;
            1143
            1144    #ifdef COUNT_MEMORY
            1145            system_remain_memory("main start");
            1146    #endif
            (gdb) where
            #0  0x00015040 in main (argc=1, argv=0xbeb6fe24) at main.c:1142
            (gdb) bt
            #0  0x00015040 in main (argc=1, argv=0xbeb6fe24) at main.c:1142
            (gdb)
            从上述输出可以清楚的看到,段错误出现在main.c的第1142行,问题已经清晰地定位到了。

 

 

 

我对core文件资料的收集整理 //---------------------------------------------------------------1. core文件的简单介绍//---------------------------------------------------------------在一个程序崩溃时,它一般会在指定目录下生成一个core文件。core文件仅仅是一个内存映象(同时加上调试信息 阅读详情

相关推荐

Linux 系统为何产生大量的 core 文件?

Linux 系统为何产生大量的 core 文件?

RAB 6847

linux下core file size设置笔记

转自:https://www.cnblogs.com/kevingrace/p/8243938.html 1)core文件简介 core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试。当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文件,默认生成位置与可执行程序位于同一目录下,文件名为core.***,其中***是某一数字。 2)开启...

weixin_30345577的博客 3160

linux 下崩溃文件coredump 生成及调试分析

Windows环境崩溃问题(dump)可根据vs调试或windbg工具查看.linux环境崩溃文件为core文件,可以使用gdb进行调试分析。

baidu_16370559的博客 6672

国产服务器如何修改core file size使其生效

limits.conf修改生效

aischang 780

一篇文章轻松学会使用gdb调试程序的core文件(调试全过程)

一篇文章轻松学会使用gdb调试程序的core文件(调试全过程)

Warren++的博客 1万+

本地部署大模型 vs 网页版大模型区别

fill:#333;color:#333;color:#333;fill:none;本地服务器/工作站硬件资源私有化部署GPU集群高速存储模型文件训练框架推理引擎。

Ds-Rag的博 1712

linux/Ubuntu下生成core dump文件调试方法

一、linux下生成core dump文件调试方法及设置 转自:http://andyniu.iteye.com/blog/1965571 core dump的概念: Acore dumpis the recorded state of the working memory of a computer program at a specific time, generally when ...

深之JohnChen的专栏 1万+

银河麒麟v10(x86_64)升级openssh实操成功

本文详细介绍了在银河麒麟V10系统上将OpenSSH从8.2p1升级至9.9p2版本的全过程。主要内容包括:系统环境确认、安装telnet备用连接、备份配置、卸载旧版本、安装新版本、服务配置与验证等关键步骤。特别强调了安全注意事项,如必须安装telnet作为备用连接、重要配置备份等。升级后提供了安全加固建议,包括修改SSH端口、禁用root登录等。文章还包含详细的故障排查方法和恢复方案,确保升级过程安全可靠。通过本教程,用户可以顺利完成OpenSSH版本升级,提升系统安全性。

淘淘小窝 1090

linux下生成core dump文件调试方法及设置

转自:http://andyniu.iteye.com/blog/1965571 core dump的概念: A core dump is the recorded state of the working memory of a computer program at a specific time, generally when the program has terminated

zzwdkxx的专栏 1万+

Unity游戏接入穿山甲广告SDK全攻略:从零到上线的避坑指南

本文为Unity开发者提供了接入穿山甲广告SDK的完整实战指南。详细解析了从账号注册、应用创建到Unity插件集成、安卓与iOS平台打包配置的全流程,并重点分享了广告加载失败、展示异常等常见问题的排查与解决方案,帮助开发者高效实现游戏广告变现。

weixin_29015899的博客 536

Jenkins部署前后端分离项目最全图文教程(手把手教学)

最近Jenkins部署的热度比较高,于是就想出一篇关于我是如何使用Jenkins部署前后端分离项目的,本篇记录了我是如何一步一步去配置、搭建和部署的完整流程,每一行代码都进行了实测和讲解,通过图文的教学写成博客分享给大家!

黄团团的个人博客 4780

Linux下core文件生成及调试的方法

在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。   1.core文件的生成开关和大小限制   1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。   2) 使用ulimit -c filesize命令,

182

set_input_delay/set_output_delay介绍

针对这一类的情况,在做block时,cts之后,便需要将update_io_latency给关闭。那么,计算的timing就是错误的了。对于hier flow来讲,切分block,进行timing budget的时候,clock tree还未长。计算block端口上的timing,通常需要用到set_input_delay和set_output_delay告知工具外部电路的延迟信息,以方便工具计算端口上的timing。此时,工具在计算in2reg的timing时,便会将2.67ns的delay带进来。

芯冰乐 319

Linux下生成core文件,并用gdb调试core文件/ gdb调试段错误方法

在写C/C++程序时,有时会遇到段错误,这个时候用gdb的bt命令根据堆栈信息一般都能很好的定位到程序是崩溃在哪里. gdb ./a.out run #执行之后崩溃 bt #查看堆栈信息

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 1673

【系统分析师】第6章-基础知识:企业信息化(核心总结)

企业信息化是数字化转型的核心,涵盖战略规划、技术应用和实施路径等方面。关键内容包括ERP、CRM、SCM等系统的定义与实施,以及数据仓库、商业智能等技术的应用。备考系统分析师需掌握信息化战略规划方法(如BSP、SDP)、系统建模工具,并能分析解决信息孤岛等问题。论文可围绕ERP实施、数据仓库应用等主题展开。企业信息化面临组织变革、技术选型等挑战,但能显著提升运营效率和竞争力。

数据知道的博客 6933

【CANoe示例分析】SOMEIPWithvCDL_16

本示例来源于官方提供的示例工程:0004_基于vCDL实现SOMEIP通信_Demo\0004_基于vCDL实现SOMEIP通信_Demo\SOMEIPWithvCDL。

jasonj333 567

linux下core文件调试方法,linux 下core文件生成、路径、格式设置及调试

core文件生成及调试1 代码#includeint main(){int *p = NULL;*p = 0;return 0;}shell2 在当前shell执行ulimit -c unlimited注意:该命令只在当前shell生效,其余shell会失效ulimit -c是0,生成core文件失败。3 设置core文件格式和生成路径,默认在执行程序当前目录下,执行如下两条命令:echo "1"...

weixin_42571280的博客 334

Burpsuite系列安全渗透--自动扫描生成h5报告

第一章简述 Burpsuite是基于Java的用于web安全的工具,能够进行爬虫、代理、编码、密码爆破等任务,并支持对XSS漏洞、文件包含等漏洞的主动扫描或被动扫描。burpsuite2.0具体分为以下11个模块: Dashboard(仪表盘)——显示任务、实践日志等。 Target(目标)——显示目标目录结构的的一个功能。 Proxy(代理)——拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,查看,修改在两个方向上的原始数据流。 Intruder(...

魔都虫师的博客 2890

Linux环境崩溃生成core文件以及调试

原文地址:https://www.cnblogs.com/secondtonone1/p/5732938.html 步骤很详细具体,很有帮助,所以转发 Windows环境崩溃问题可根据vs调试工具查看,Linux同样可以查看调用堆栈的信息,只是 需要更改Linux设置,使程序崩溃时候产生core文件。然后gdb调试即可。 1产生core文件方法 产生coredump的条件,首先需要确认当...

lv0918_qian的博客 810

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

c/c++基础(二十七) Linux下core文件调试方法

在程序开发中,我们常常用多种方法来定位程序的异常退出,如:打印日志,gdb core等. 在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。 1.core文件的生成开关和大小限制  1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,

if(...){...} 1052

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Linux下core文件调试方法

在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。 1.core文件的生成开关和大小限制  1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。  2)使用ulimit -c filesize命令,可

2012回首嵌入式学习两年历程 1094

linux 捕获sigsegv信息如何生成core文件,[转]Linux下的段错误产生的原因及调试方法&&Core Dump...

简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址.一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一...

weixin_33508272的博客 1153

linux qt下生成core文件方法

linux下生成core文件如何生成 core 文件 ?命令行输入 ulimit -c 如果显示 0 那么说明 生成core 是被关闭。 再输入如下命令,设置生成core文件,并不限制大小ulimit -c unlimited注意如上的命令,只在当前终端生效,要是某个用户都生效,可以使用如下方法 在用户的 ~/.bash_profile 里加上 ulimit -c unlimited 来让

z526882183的专栏 2797
上一篇: Linux下core文件生成及调试的方法
下一篇: /proc/meminfo信息介绍
lb015331
博客等级 码龄19年 22粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值