gdb除錯嵌入式裝置的core檔案

帥大鑫發表於2020-10-30
  • 除錯嵌入式裝置時,產生了一個段錯誤,查資料後明白瞭如何使用gdb除錯該段錯誤的基本方法,記錄一下,免得以後遇見,又忘記怎麼操作,有錯誤之處望聯絡指出

1、生成core檔案

由於該嵌入式裝置本身不支援gdb,所以還是生成core檔案,拿到虛擬機器中進行除錯

  • 使用以下命令生成core檔案
    ulimit -c
    ulimit -c unlimited
    echo "/opt/core.%e.%t" > /proc/sys/kernel/core_pattern
    cat /proc/sys/kernel/core_pattern	
    

    ①如果ulimit -c命令列印得出的是0,則表示不支援生成core檔案,然後需要使用ulimit -c unlimited命令;
    /proc/sys/kernel/core_pattern檔案是生成的core檔案所放的位置,可以使用cat /proc/sys/kernel/core_pattern命令檢視。也可以自定義core檔案生成的位置,比如使用命令echo "/opt/core.%e.%t" > /proc/sys/kernel/core_pattern,將生成的core檔案儲存到/opt目錄,並命令為core.%e.%t%e指執行的程式或程式,%t指生成隨機數

2、除錯core檔案

  • 1、將生成的core檔案移動到虛擬機器中,可以將該嵌入式裝置檔案系統掛載到虛擬機器中,參考NFS掛載嵌入式裝置檔案系統。還需要將產生段錯誤時,所執行的可執行程式一起復制到虛擬機器中,另外還需要將所執行的可執行程式所依賴的所有庫全部複製到虛擬機器中,並且保持庫在攝像頭時,所在目錄的位置,即保證路徑要相同

  • 2、使用以下命令開始除錯

    ./mips-linux-gnu-gdb ipcam core.ipcam.2398
    

    mips-linux-gnu-gdb是我的攝像頭平臺所支援的gdb,如果嵌入式裝置的系統不支援使用gdb,需要自行安裝嵌入式裝置平臺所支援的gdb
    ipcam是我產生段錯誤時,所執行的程式;
    core.ipcam.2398是生成的core檔案;
    ④這三個檔案都是在用一個目錄,所以可以直接執行,如果沒有在同一個目錄,需要使用絕對目錄或者相對目錄。

  • 3、檢視所依賴庫是否正確載入

    info sharedlibrary
    

    如果已找到對應的庫則其FromTo會有值,syms Read的值為yes,並且右邊路徑顯示的就是庫在虛擬機器中所在的位置。如果未找到對應的庫則FromTo為空,syms Read的值為No

  • 4、設定程式ipcam的依賴庫的位置

    這裡設定依賴庫的位置有點繞:假設ipcam有兩個依賴庫,分別為libcrypto.so.1.0.0libssl.so.1.0.0,並且這兩個庫在攝像頭時,其所在位置分別為/app/lib/libcrypto.so.1.0.0/lib/libssl.so.1.0.0
    ①如果使用命令set sysroot /opt,如果設定位置/opt,那麼libcrypto.so.1.0.0libssl.so.1.0.0在虛擬機器的位置則必須分別為/opt/app/lib/libcrypto.so.1.0.0/opt/lib/libssl.so.1.0.0,沒有的目錄需要自行建立;
    ②如果使用命令set sysroot /,設定位置/,那麼libcrypto.so.1.0.0libssl.so.1.0.0在虛擬機器的位置則必須分別為/app/lib/libcrypto.so.1.0.0/lib/libssl.so.1.0.0,沒有的目錄需要自行建立;
    ③其他目錄設定類似

  • 5、設定依賴庫的位置後,再使用info sharedlibrary命令即可看的出來。然後使用bt命令,即可列印出產生段錯誤的函式,函式呼叫是從下往上。

相關文章