1. 程式人生 > >linux core dump檔案生成和除錯

linux core dump檔案生成和除錯

1.core dump檔案生成

project(coredumptest)
cmake_minimum_required(VERSION 2.8)
add_compile_options(-std=c++11 -pthread -g  -ggdb -O0 -Wall   -fstack-protector-all -march=native -fnon-call-exceptions)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})

其中-g表示使用debug編譯,
-ggdb:在可執行檔案中包含可供GDB使用的除錯資訊
-O0 表示編譯時不優化,關閉所有優化選項
-Wall 開啟大部分警告提示
-fstack-protector-all 保護棧資訊
使用 -march=native,GCC會自動檢測你的CPU支援的指令集。
-fnon-call-exceptions 產生的程式碼可供陷阱指令(如非法浮點運算和非法記憶體定址)丟擲異常,需要相關平臺的執行時支援,並不普遍有效
(2)測試用例

#include <stdio.h>
int main()
{
    char *ptr="linuxers.cn";
    *ptr=0;
}

執行時會報段錯誤.
(3)設定core檔案大小

系統預設是不生成core檔案的,只有手動輸入ulimit -c xx命令才會產生core檔案

ulimit -c 1024 設定core檔案最大為1024k  
ulimit -c unlimited 不限制core檔案大小

執行
./coredumptest
發現可執行程式資料夾下生成了core檔案.
注意ulimit -c unlimited 只在當前路徑下有效,換個路徑輸入ulimit -c發現為0

2使用gdb分析,檢視堆疊情況

輸入命令 gdb ./coredumptest core
輸出如下,

Reading symbols from ./coredumptest...done.
[New LWP 28151]
Core was generated by `./coredumptest'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00000000004007e0 in main ()
    at /home/rootroot/workspace/AProgramtest/coredumptest/main.cpp:6

at /home/rootroot/workspace/AProgramtest/coredumptest/main.cpp:6
表示main.cpp的第6行出現錯誤

3.永久生成coredump檔案

多執行緒程式中的有些錯誤並不是每次都能夠出現的,偶爾出現一次可是很難得的,此時就需要儲存錯誤現場,便於慢慢分析.那麼就需要出現coredump的時候就能夠生成和儲存core檔案.
永久性的生成coredump檔案,在/etc/bashrc或者~/.bashrc檔案中加ulimit -c unlimited
重啟電腦,輸入ulimit -c 輸出為unlimited