`

core文件分析

阅读更多

core文件分析


一、Core文件描述
Coredump在unix平台是非常容易出现的一种错误形式,直接表现形式为core文件, core文件产生于当前目录下,通常,象内存地址错误、非法指令、总线错误等会引起coredump,core文件的内容包含进程出现异常时的错误影像。如果错误进程为多线程并且core文件的大小受限于ulimit的系统限制,则系统只将数据区中错误线程的堆栈区复制到core文件中。
应当注意,从AIX 5L版本5.1开始core文件的命名格式可以通过环境变量CORE_NAMING设置,其格式为:
core.pid.ddhhmmss,分别代表为:
pid:进程标示符
dd:当前日期
hh:当前小时
mm:当前的分钟
ss:当前的秒
core文件的缺省格式为老版本的格式,coredump文件的内容按照以下的顺序组织:
1) core文件的头部信息
定义coredump的基本信息,及其他信息的地址偏移量

 

2) ldinfo结构信息
定义loader区的信息

 

3) mstsave结构信息
定义核心线程的状态信息,错误线程的mstsave结构信息直接存储在core文件的头部区,此区域只对多线程的程序有效,除错误线程外的其他线程的mstsave结构信息存与此区域。

 

4) 缺省的用户堆栈数据
存储coredump时的用户堆栈数据

 

5) 缺省的数据区域
存储用户数据区域信息

 

6) 内存映射数据
存储匿名的内存映射数据

 

7) vm_info结构信息
存储内存映射区域的地址偏移量和大小信息。缺省情况下,用户数据、匿名的内存区域和vm_info结构信息并不包含在core文件中,core文件值包含当前的进程堆栈、线程堆栈、线程mstsave结构、用户结构和错误时的寄存器信息,这些信息足够跟踪错误的产生。Core文件的大小也可以通过setrlimit函数设定。
 
二、Core文件分析
首先分析coredump的结构组成,core文件的头信息是由结构core_dump结构定义的,结构成员定义如下:
成员                 类型                       描述
c_signo         char                    引起错误的信号量
C_entries      ushort                Coredump的模块数
*c_tab          Struct ld_info      Core数据的地址偏移量
c_flag            char                    描述coredump的类型,类型为:
                                                     FULL_CORECore包含数据区域
                                                     CORE_VERSION_1生成 core文件的AIX的版本
                                                     MSTS_VALID包含mstsave的结构
                                                     CORE_BIGDATACore文件包含大数据
                                                     UBLOCK_VALIDCore文件包含u_block结构
                                                     USTACK_VALIDCore文件包含用户堆栈数据
                                                     LE_VALIDCore文件至少包含一个模块
                                                     CORE_TRUNCCore文件被截短

c_stack          Caddr_t             用户堆栈的起始地址偏移量
C_size            int                     用户堆栈的大小
C_mst            Struct mstsave  错误mst的拷贝
C_u                Struct user        用户结构的拷贝
C_nmsts         int                    Mstsave结构的数量
C_msts           Struct mstsvae * 线程的mstsave结构的地址偏移量
C_datasize     int                    数据区域的大小
C_data           Caddr_t           用户数据的地址偏移量
C_vmregions  int                    匿名地址映射的数量
C_vmm           Struct vm_info *  Vm_info数据表的起始地址偏移量

 

借助于下面提供的程序可以分析core文件的部分信息:

#include <stdio.h>
#include <sys/core.h>
void main(int argc, char *argv[])
{
 FILE *corefile;
 struct core_dumpx c_file;
 char command[256];
 if (argc != 2) {
  fprintf(stderr, "Usage: %s <corefile>\n", *argv);
  exit(1);
 }
 if ((corefile = fopen(argv[1], "r")) == NULL) {
  perror(argv[1]);
  exit(1);
 }
 fread(&c_file, sizeof(c_file), 1, corefile);
 fclose(corefile);
 sprintf(command, "lquerypv -h %s 6E0 64 | head -1 | awk '{print $6}'", argv[1]);
 printf("Core created by: \n");
 system(command);
 printf("Signal number and cause of error number: %i\n", c_file.c_signo);
 printf("Core file type: %i\n", c_file.c_flag);
 printf("Number of core dump modules: %i\n", c_file.c_entries);
 printf("Core file format number: %i\n", c_file.c_version);
 printf("Thread identifier: %i\n", c_file.c_flt.th.ti_tid);
 printf("Process identifier: %i\n", c_file.c_flt.th.ti_pid);
 printf("Current effective priority: %i\n", c_file.c_flt.th.ti_pri);
 printf("Processor Usage: %i\n", c_file.c_flt.th.ti_cpu);
 printf("Processor bound to: cpu%i\n", c_file.c_flt.th.ti_cpuid);
 /* 
 if (c_file.c_flt.th.ti_cpu > 1) 
  printf("Last Processor: cpu%i\n", c_file.c_flt.th.ti_affinity);
 */
 exit(0);
}

把该程序编译成可执行程序:

gcc -o anacore anacore.c

(这里也可以用xlc编译器,但我的机器上只有gcc)

 

现在根据以下步骤编写测试程序并进行测试:

1) 通过下面的程序生成core文件

main() {
 char *testadd;
 strcpy(testadd, "Just a testing");
}

 程序命名为core.c

 

2) 编译程序core.c

gcc -o pcore core.c

(这里也可以用xlc编译器,但我的机器上只有gcc)

 

3) 运行pcore产生core文件

./pcore

Segmentation fault (core dumped)

 

4) 运行anacore察看结果
./anacore core

 

5) 结果如下

-bash-3.00$ ./anacore core
Core created by:
|pcore...........|
Signal number and cause of error number: 11
Core file type: 115
Number of core dump modules: 0
Core file format number: 267312561
Thread identifier: 2113597
Process identifier: 1347756
Current effective priority: 60
Processor Usage: 0
Processor bound to: cpu-1

从上面的结果,我们可以简单的分析产生core文件的应用、信号量及进程等信息,如果要求一些更详细的信息,可以借助于dbx等调试工具进一步分析。

分享到:
评论

相关推荐

    javaCore文件分析工具(最新版-2012-12-18)

    javaCore文件分析工具(最新版-2012-12-18) 用于分析系统宕机时产生的javacore文件

    怎样分析core文件

    8. **使用其他工具**:除了GDB,还有一些其他工具如`addr2line`、`nm`、`objdump`等,可以帮助解析二进制文件中的地址和符号信息,辅助分析。 9. **代码审查**:分析完core文件后,对涉及的代码进行仔细审查,查找...

    coredump文件的生成与解析.docx

    coredump 文件的生成与解析 ...coredump 文件的生成和解析对于程序崩溃后的调试和分析非常重要。通过对 coredump 文件的分析,可以了解程序崩溃的原因和函数调用路径,从而帮助开发者快速地定位和解决问题。

    高通core dump解析工具

    “Core dump解析工具”是一种专门用于读取和分析core dump文件的软件。高通的core dump解析工具可能针对其特定的硬件架构和操作系统进行了优化,能够提供更详细的调试信息,这对于在高通芯片上运行的应用或者系统...

    websphere javacore文件分析工具

    websphere在内存溢出的时候会产生javacore文件,分析这个文件可以看出cpu的使用情况。

    javacore分析工具

    `jca412.jar`可能是一个包含Java Core Analysis工具的库文件,用于解析和展示JavaCore日志文件。这种工具通常会提供图形界面或命令行选项,便于用户查看和理解分析结果。 `jca.properties.xml`可能包含了Java Core ...

    javacore和dump分析工具

    这个文件最重要的作用就是分析 Java 堆内存泄露问题,heap analyzer,MAT 等工具都可以分析这种文件。 Java core 文件保存的是 java 应用程序在崩溃时或任一时刻关于 Java 运行环境的各种信息。包括 Java 虚拟机的...

    使用gdb分析core文件相关方法

    ### 使用gdb分析core文件相关方法 #### 一、引言 在软件开发与维护的过程中,遇到程序崩溃的情况是常有的事。此时,利用gdb分析core文件是一种非常有效的方法来定位并解决问题。本文旨在详细介绍如何使用gdb来分析...

    javacore文件及heapdump文件分析

    javacore 文件及 heapdump 文件分析 javacore 文件和 heapdump 文件是 Java 应用程序在遇到致命问题时产生的两个文件,这两个文件可以帮助我们分析和解决 Java 应用程序中的问题。 javacore 文件是一个文本文件,...

    linux下core文件调试方法

    通过分析core文件,我们可以定位问题发生的上下文环境、线程状态以及调用栈等关键信息,从而帮助我们找到问题的原因,并进一步解决问题。 ### Linux下core文件调试方法 #### 1. 启用core文件生成 在默认情况下,...

    IBM WEBSPHERE javacore分析工具jca

    它会调用`jdb`(Java Debug Interface)或者其他分析工具,对javacore文件进行解析。 3. **识别问题**:分析结果会显示各个线程的堆栈跟踪,这有助于定位导致问题的具体代码行或系统调用。如果问题与JCA相关,你...

    javacore\heapdump文件分析工具

    本篇文章将详细讲解如何使用`javacore`和`heapdump`分析工具,特别是针对Websphere环境的`ha`和`jca`工具,以及如何使用JDK1.6来打开和解析这些文件。 首先,`javacore`文件是Java虚拟机(JVM)在遇到特定事件(如...

    linux coredump分析方法实例介绍

    2. 分析 Core Dump 文件:使用 GDB 调试器来分析 Core Dump 文件,了解系统崩溃的原因。 3. 加载符号表:使用 file 命令加载符号表,以便后续的分析。 4. 定位段错误:使用 where 命令来定位段错误的位置。 5. 分析...

    dbx调试core文件

    5. 检查core文件,当有core文件生成后,可以通过dbx命令来加载core文件,分析程序崩溃时的环境。 6. 设置断点和跟踪,这对于程序中特定位置的分析非常有用,可以是基于源代码行、函数,或者是特定条件的断点。 7. ...

    浅析Linux中的core文件及调试方法

    通过这种方式,开发者可以逐步解析core文件,了解程序崩溃时的内存布局,从而找出问题的根源并修复它。 总之,Linux中的core文件是调试程序的关键工具,尤其是在处理诸如段错误这样的运行时错误时。理解core文件的...

    IBM WebSphere JavaCore分析工具

    JavaCore文件分析工具通常包含以下功能: 1. **堆栈跟踪解析**:工具能够解析JavaCore文件中的堆栈跟踪信息,显示各个线程的状态,帮助用户理解哪个线程在出现问题时正在执行哪些操作。 2. **内存分析**:分析工具...

    Linuxcore文件介绍.pdf

    Core Dump文件包含进程终止时刻的内存映像,用于之后进行错误分析和调试。本文档将对Linux中的Core Dump文件进行详细介绍。 ulimit命令 ulimit命令用于控制shell进程及其子进程可以使用的资源。其中,-c选项用于...

    Java Core-HeapDump文件及其分析方法.docx

    "Java Core-HeapDump 文件及其分析方法" Java Core-HeapDump 文件是 Java 应用程序在发生致命问题的情况下产生的两个文件,它们分别是 JavaCore 文件和 HeapDump 文件。这些文件能够帮助开发者保留 Java 应用程序...

Global site tag (gtag.js) - Google Analytics