目前有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可以知道。不過好像沒有起效果。