使用 core dump 查找程序遇到严重问题退出的原因
生活随笔
收集整理的這篇文章主要介紹了
使用 core dump 查找程序遇到严重问题退出的原因
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
不使用 ulimit 命令,在程序中使用 API 開啟 core dump。注意:只對當前程序有效。#include <sys/resource.h> int enableCoreDump(void) { struct rlimit r_old, r_new; getrlimit(RLIMIT_CORE, &r_old); printf("r_old.rlim_cur : %d, r_old.rlim_max : %d\n", r_old.rlim_cur, r_old.rlim_max); r_new.rlim_cur = RLIM_INFINITY; r_new.rlim_max = RLIM_INFINITY; if (setrlimit(RLIMIT_CORE, &r_new) != 0) { getrlimit(RLIMIT_CORE, &r_old); printf("r_old.rlim_cur : %d, r_old.rlim_max : %d\n", r_old.rlim_cur, r_old.rlim_max); } r_new.rlim_cur = r_old.rlim_max; r_new.rlim_max = r_old.rlim_max; setrlimit(RLIMIT_CORE, &r_new); getrlimit(RLIMIT_CORE, &r_old); printf("r_old.rlim_cur : %d, r_old.rlim_max : %d\n", r_old.rlim_cur, r_old.rlim_max); return 0; } 編譯程序時注意使用 -g 標志,加入調試信息,否則調試時只能看到函數地址,看不到函數名。程序遇到嚴重錯誤退出后,會在啟動程序的目錄下生成 core 文件。將 core 文件復制到主機,用交叉編譯器提供的gdb 打開。arm-linux-gdb ./a.out core輸入 where,即可看到函數在哪退出的,以及函數調用棧。下面是輸入 where 后,輸出的函數調用棧:Program terminated with signal SIGSEGV, Segmentation fault. #0 0x00008c48 in cJSON_GetArrayItem (array=<optimized out>, item=171880) at cJSON.c:662 662 cJSON *cJSON_GetArrayItem(cJSON *array,int item) {cJSON *c=array->child; while (c && item>0) item--,c=c->next; return c;} (gdb) where #0 0x00008c48 in cJSON_GetArrayItem (array=<optimized out>, item=171880) at cJSON.c:662 #1 0x0000b8dc in addItem (cacheArray=0xe1a03000, statusArray=0x29f68, mode=CACHE_MODE_SYNC) at CacheManager.c:162 #2 0x0000b8dc in addItem (cacheArray=0xe1a03000, statusArray=0x29f68, mode=CACHE_MODE_SYNC) at CacheManager.c:162 #3 0x00000000 in ?? () Backtrace stopped: frame did not save the PC
來自為知筆記(Wiz)
來自為知筆記(Wiz)
轉載于:https://www.cnblogs.com/JonnyLulu/p/4485842.html
總結
以上是生活随笔為你收集整理的使用 core dump 查找程序遇到严重问题退出的原因的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蹭课神器NABCD分析
- 下一篇: SQLSERVER2014的内存优化表