嵌入式core dump除錯方法
一、為什麼使用coredump
有的時候寫的程式總會遇到各種異常或者bug導致退出中止,但是程式卻沒有打印出可供參考的log資訊,這時候就可以利用code檔案進行分析。一般情況下,code檔案會記錄程式執行的記憶體,暫存器,堆疊指標等資訊,想要使用code檔案分析,就需要在linux系統中設定一下。
二、嵌入式下coredump生成設定
1.一般linux系統下預設是不會生成core dump檔案的(畢竟生成的檔案還是蠻大的),通過ulimit –a (如下圖所示)可以檢視能生成的code檔案的大小,一般是0。可以通過“ulimit –c 引數(blocks)”或者“ulimit –c unlimited”設定,建議用後者。
2.設定core dump檔案的輸出位置,一般預設是當前目錄,可以通過“echo “1” > /proc/sys/kernel/core_user_pid ”使core檔案加上pid號,也可以用“echo ”core儲存目錄/core-%e-%p-%t“ > /proc/sys/kernel/core_pattern ” 設定。
以下是引數表:ps:用到的也就那麼幾個
%p – insert pid into filename 新增pid
%u – insert current uid into filename 添加當前uid
%g – insert current gid into filename 添加當前gid
%s – insert signal that caused the coredump into the filename 新增導致產生core的訊號
%t – insert UNIX time that the coredump occurred into filename 新增core檔案生成時的unix時間
%h – insert hostname where the coredump happened into filename 新增主機名
%e – insert coreddumping executable name into filename 新增命令名
3.執行程式,等停止退出後將生成的core檔案,通過掛載u盤或者網路的方式拷貝到pc機Linux系統下,並和生成的可執行程式放在一個目錄下。
ps:重啟有可能會將上面的設定清除,最好執行前檢視一番。
三、pc機Linux下分析core檔案
1.先確定自己用的嵌入式處理器架構是ARM或者MIPS,選擇相應的除錯工具,下面以MIPS為例。mips-linux-gdb [exec file] [core file]
2.進入gdb以後需要執行info sharedlibrary來檢視是否已經將需要的庫匯入,否則有可能查詢位置時顯示的是“??”。
3.匯入所需要的庫,通過set solib-absolute-prefix 或者set solib-search-path 設定符號檔案的位置。solib-absolute-prefix設定的是被搜尋檔案路徑的字首,solib-search-path設定的是被搜尋檔案的路徑,solib-search-path可以有多個路徑,中間按用:隔開, solib-absolute-prefix的值只能有一個。但一般常用solib-search-path 。
首先通過find或者其他方法找到所需要的庫,“(gdb)solib-search-path 庫路徑:庫路徑”
4.最後通過bt命令查詢到位置,基本就能確定程式死在哪個檔案哪個函數了。可以通過“(gdb)l *地址”(如:(gdb)l *0x76b693dc)檢視那個位置的函式,不過還是建議用source insight檢視方便。
5.最後補充一個檢視庫檔案結構的命令
Linux下動態庫檢視方法:nm -D lib.so
Linux下靜態庫檢視方法:ar -t lib.a