- 測試環境
- 開發板:致遠電子EPC-9600-V2.06
- 開發環境:DeepIn15.11
- 開發語言:C語言
- 測試軟件:Final Shell3.0.10
- 目錄
- 分清你的程序是前臺運行還是後臺運行,二者有何區別
- 前臺運行和後臺運行的區別
- 前後臺程序生成core dump時有何區別
- 前臺進程如何生成core dump
- 後臺進程如何生成core dump
- 正文
- 分清你的程序是前臺運行還是後臺運行,二者有何區別
- 前臺進程:一般而言,用戶在shell中使用./執行的程序都是前臺程序,前臺程序可由用戶自己控制,程序運行過程中可與用戶進行交互,其運行優先級相比後臺程序稍高,前臺程序運行過程中用戶可使用ctrl+c來終止
- 後臺進程:後臺進程又叫守護進程,是運行在系統後臺的一種特殊進程,它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件,後臺進程最大的特點就是不受終端控制。一般用作系統服務,比如日誌管理進程rsyslogd,數據庫服務myspld等,當然也有一些用戶程序因需要被放在後臺運行,一般被放在/etc/ini.d/文件夾中設置開機自啓動
- 前後臺程序生成core dump時有何區別
- 我們在生成core dump時一般先使用ulimit -c 來開啓系統限制,然後再配置/proc/sys/kernel/core_pattern設定core dump文件的生成路徑。
- 但是ulimit命令是有作用範圍的,事實上ulimit限制的是當前shell進程以及其派生的子進程,所以通過ulimit修改coresize只是針對在當前shell下啓動的子進程,而不能影響其他shell下啓動的進程。
- 所以當我們配置完成生成core dump的參數後,在當前shell直接執行的進程發生崩潰時可以正常生成core,而後臺開機自啓動的程序則無法生成,而對於被用於工業控制的嵌入式板,應用程序一般都是開機自啓動的,並且發送崩潰的時機也是不可預測的,那麼使用這種方式就不能正確的去捕捉coredump文件了
- 前臺進程如何生成core dump
- 如上文所說,前臺程序想要生成core dump文件,只需在程序運行之前配置好core dump相關設定即可
- uliimit -c unlimit //開啓core 生成,並不對生成core文件大小進行限制
- echo "/media/mmcblk0p1/%e-%t.coredump" > /proc/sys/kernel/core_pattern //設置文件保存路徑以及文件名
- 如上文所說,前臺程序想要生成core dump文件,只需在程序運行之前配置好core dump相關設定即可
- 後臺進程如何生成core dump
- 後臺進程要生成core dump文件需在進程代碼中開啓core dump功能,可調用setrlimit函數來實現對coresize參數的設置,所以在調試後臺程序時只需在程序中添加以下代碼段開啓core dump功能即可(文件生成地址可自行修改)
-
static int enableCoreDumpFunc(){ int iRes = RLIMIT_CORE; struct rlimit limitParam; limitParam.rlim_cur = 1 ? RLIM_INFINITY : 0; limitParam.rlim_max = 1 ? RLIM_INFINITY : 0; if(0 != setrlimit(iRes,&limitParam)){ printf("Error: setrlimit failed, %s\n", strerror(errno)); return 0; }else{ system("echo /media/mmcblk0p1/%e-%t-%s.coredump > /proc/sys/kernel/core_pattern"); printf("Set coredump file size to %lu, path = /var/core\n",limitParam.rlim_cur); return 1; } return 0; }
-
最後在main函數中調用此函數即可開啓core dump
嵌入式Linux如何生成Core Dump文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.