使用gdb調試user程序


目前有3種方法:

方法一:將進程crash生成的corefile,從目標板子上拷貝到pc上進行分析。

    缺點比較明顯,不能實時debug進程。

    優點也很明顯,不需要單獨編譯user gdb,直接用toolchain中的就可以了。

方法二和方法三的思路都是一致的,將gdb編譯出來,下載到板子上運行,動態的debug程序。只不過編譯生成gdb的方法不一樣。

方法二:直接將gdb的source code放到sdk相應的user目錄下,編譯。結果是 編譯的gdb查看 多線程的coredump file時,會導致gdb本身crash

方法三:將toolchain和gdb下載到自己的ubuntu筆記本電腦上,直接編譯。結果是 編譯出來的gdb可以debug 多線程,不會導致gdb本身crash,也可以正常的debug某一個線程。

    不過,想切換到同一進程的其他線程,目前還不支持。原因應該是 缺少圖片中所示的lib。

 

方法一:將coredump文件放到服務器,再用toolchain的gdb查看

1.打開core功能,並設置生成的core文件的路徑和文件名格式(都是臨時修改,重啟不會保存)

ulimit -c unlimited

echo "/tmp/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

2.生成core文件

做完第一步后,重新拉起待監測的進程,使其crash

core-myClient-11415-1635469554

3.將生成的core文件導入到服務器上

如果是ftp傳輸,注意切換到binary傳輸模式,否則會在后面出現gdb不認識core文件

4.找到toolchain里的gdb,並讀取nostrip的可執行檔

./msdk-linux-gdb ~ /romfs_nostrip/bin/ myClient

5.讀取剛剛生成的core file,目前這個是 strip的可執行檔生成的

(gdb) core-file ~/core- myClient -11415-1635469554

 

結果如下

Core was generated by `/bin/myClient.

Program terminated with signal SIGSEGV, Segmentation fault.

#0  0x004a2c78 in set_ParameterValue (name=<error reading variable: Cannot access memory at address 0x3fec00>,

    type=<error reading variable: Cannot access memory at address 0x3fec04>,

    value=<error reading variable: Cannot access memory at address 0x3fec08>) at parameter_api.c:1926

1926                            test_return = entity->info->op->setvalue(name, entity, type, value);

 

這樣就可以定位到程序哪里出問題了。

 

方法二:借鑒客戶的方法,直接編譯user gdb,並放到板子當中運行

1.下載gdb 7.12 source code,並用我們的toolchain編譯生成可執行檔

2.將unstrip的myClient下載到板子中,修改為可執行並重新運行,等待crash出現,出現core dump file

3.運行./gdb myClient -c core- myClient -11329-1635473088

 

目前這個方案只是理論上行的通,實踐上存在一個問題,gdb雖然可以正常起來運行,不過加入core file的時候會出現gdb crash,

看warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available.

應該是gdb運行依賴於libthread_db,而我們現在沒有,或者版本不匹配

所以我們現在調試多線程的進程是不可以的

 

 

方案三 由於方案二一直行不通,所以試試其他路子

1.下載toolchain到自己的ubuntu電腦,並解壓

2.切換到root用戶,並執行如下命令,設置環境變量

export CC=/toolchain_path/bin/mips-linux-gcc

export CXX=/toolchain_path/bin/mips-linux-g++

export LD=/toolchain_path/bin/mips-linux-ld

export STRIP=/toolchain_path/bin/mips-linux-strip

export AR=/toolchain_path/bin/mips-linux-ar

3.下載gdb7.12 source code,並解壓

4. cd gdb-7.12

./configure --host=mips-linux  --disable-libquadmath

make

5.我們的libthread_db.so需要在我們的代碼中設置成no strip,這樣板子中/lib才有這個庫

6.啟動gdb后輸入 set auto-load safe-path /

 

 

至此,在debug多線程的進程時,不會導致gdb本身crash,看起來可以正常使用了。不過,這里應該還是沒有完全使用。

雖然現在可以debug多線程,不過線程間的切換,應該是不行的,因為gdb依賴於缺少的上圖中的庫。

不過,目前已經可以滿足工作需求,后面有時間再研究,怎么編譯才能支持多線程debug。

 

ps1:目前./configure 少了選項--with-build-libsubdir=$TARGET_DIR/lib,后面還要再研究下,這可能與上圖打印有關系

ps2:上面的第5步和第6步是為了試圖讓板子中有相關的lib,並且gdb可以知道。不過好像沒有起效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM