1. 程式人生 > >CORE DUMP生成除錯

CORE DUMP生成除錯

之前我除錯嵌入式linux程式,一般是藉助ucontext庫,在發生段錯誤時,直接將錯誤函式打印出來。有同事建議我使用core dump,於是我今天在嵌入式板卡嘗試了core檔案的生成,但是也是幾經波折,在網上查了很多資料,才成功生成core檔案,所以總結如下:

  如果程式段錯誤了,core檔案沒有生成,請做如下的嘗試:

  1. 檢查ulimit,輸入命令ulimit-c,看是否是0;建議修改成:ulimit -c unlimited

  2. 檢查kernel選項,CONFIG_ELF_CORE必須要開啟。這個選項應該在menu config的general裡面;記不清了,可以用grep搜尋一下你的config檔案,看當前值是什麼。

  3. 修改/proc/sys/kernel/core_uses_pid;/proc/sys/kernel/core_pattern等檔案;這時遇到許可權問題,加sudo也不行。可以用下面的方式來解決問題:

sudo bash -c "echo "1" >/proc/sys/kernel/core_uses_pid "
sudo bash -c "echo "/opt/app_driver/core-%e-%p-%t" >/proc/sys/kernel/core_pattern"
sudo bash -c "echo "1" >/proc/sys/fs/suid_dumpable"

不要直接sudo 去echo,而是在bash之前加sudo。

原因網上有資料說是:

procfs中的條目由ad hoc程式碼管理。在/proc/sys下設定檔案許可權和所有權的程式碼(proc_sys_setattr)拒絕使用EPERM更改許可權和所有權。
因此無法更改這些檔案的許可權或所有權,完全停止。這樣的改變沒有實現,因此root無效。 當您嘗試以非root使用者身份編寫時,會收到許可權錯誤。即使使用sudo echo "/home/user/foo/core.%e.%p" > /proc/sys/kernel/core_pattern,
您嘗試以非root使用者身份編寫:sudo以root身份執行echo,但重定向發生在執行sudo的shell中,該shell沒有提升許可權。使用sudo bash -c '… >…',
重定向在bash例項中執行,該例項由sudo啟動並以root身份執行,因此寫入成功。

也可以用下面的方式來修改,實際上我就是這麼成功修改的:

sudo sysctl -w kernel.core_pattern=/opt/app_driver/core-%e-%p

 

如此再執行程式,出現段錯誤,就能夠在/opt/app_driver/ 目錄下生成core檔案

 生成段錯誤之後,就可以用gdb檢視段錯誤資訊了。 sudo gdb ./demoout core-xxx-855   輸入bt,列印backtrace

&n