Posted on 2008-10-29 14:58
Prayer 閱讀(623)
評論(0) 編輯 收藏 引用 所屬分類:
LINUX/UNIX/AIX
內容提要:
主要包含兩部分內容:
1,core文件描述
2,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 結構信息
3 )
mstsave 結構信息
定義核心線程的狀態信息,錯誤線程的mstsave 結構信息直接存儲在core 文件的頭部區,此區域只對多線程的
程序有效,除錯誤線程外的其他線程的mstsave 結構信息存與此區域。
4 ) 缺省的用戶堆棧數據
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);}假定以上程序的可執行程序名稱為
anacore ,按照以下步驟察看其運行結果:
1 ) 通過下面的程序生成
core 文件
main() {
char *testadd;
strcpy(testadd, 搣Just a testing攠);
}
程序命名為core.c
2 ) 編譯程序
core.c
3 ) 運行
pcore 產生
core 文件
4 ) 運行
anacore 察看結果
5 ) 結果如下
[root@F80_1#]acore coreCore created by:|pcore...........|Signal number and cause of error number: 11Core file type: 114Number of core dump modules: 0Core file format number: 267312561Thread identifier: 40827Process identifier: 9520Current effective priority: 60Processor Usage: 0Processor bound to: cpu-1從上面的結果,我們可以簡單的分析產生
core 文件的應用、信號量及進程等信息,如果要求一
些更詳細的信息,可以借助于
dbx 等調試工具進一步分析。