之前我調試嵌入式linux程式,一般是藉助ucontext庫,在發生段錯誤時,直接將錯誤函數列印出來。有同事建議我使用core dump,於是我今天在嵌入式板卡嘗試了core文件的生成,但是也是幾經波折,在網上查了很多資料,才成功生成core文件,所以總結如下: 如果程式段錯誤了,core文件沒有生 ...
之前我調試嵌入式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查看段錯誤信息了。1.sudo gdb ./demoout core-xxx-855
2.輸入bt,列印backtrace
3.x/128xw 0xb58cd4e8 來列印記憶體