我的需求,有一個項目,程序由一個主程序和一堆動態庫組成,運行在目標機上,希望能夠在開發機上進行遠程調試。
於是想到了使用gdbserver來調試,中間碰到一些問題,記錄下來
1.demo程序
創建了一個demo程序來模擬,由主程序和動態庫兩個文件夾,開發機上的目錄結構如下
--proj
|---exemain
----exemain.cpp
----|Debug
----|----exemain
|---dlla
----dlla.cpp
----|Debug
----|---libdlla.so
其中exemain調用dlla裏的函數mymax
將可執行文件exemain和libdlla.so拷貝到目標機上,確認可以執行
2.目標機上使用gdbserver
在目標機上執行gdbserver :1234 ./exemain 其中1234是端口號
3.在開發機上調試
#cd proj/exemain/Debug
#gdb -q ./exemain
(gdb) target remote 172.103.1.59:1234
(gdb) b main
(gdb) c
(gdb) i shared
(gdb) set solib-search-path ../../dlla/Debug/
(gdb) b mymax
尤其需要注意的是,先在mian處打斷點,並且運行到main之後再去設置solib-search-path ,然後再在dlla中的函數上打斷點,否則顯示的斷點並沒有源文件行數,推測大概是隻有運行進了main之後纔會發現dlla庫並加載,使用set solib-search-path時纔會加載符號和源文件行號,再去打斷點才能找到。
4.使用eclipse
目前使用eclipse也存在問題,如果直接使用遠程調試的話還是無法進入庫文件的源文件中調試,需要在終端中手動輸入。
5.在之前gdb成功的基礎上具體說一下eclipse怎麼配置
工作空間設在proj下,下面有兩個項目dlla和exemain。
選中exemain,選擇調試下面的調試-配置
雙擊c/c++ remote application會出現遠程調試的設置選項,
填寫名稱
connection後新建,選ssh only,下一步填寫主機名,連接名,下一步
選擇c/c++程序後面的搜索項目,選中debug/exemain
在remote absolute file path for c/c++ application後面的瀏覽中,選中目標機上的可執行文件,需要填寫目標機的用戶名密碼
然後點應用,就可以調試了
但是在調試中還是隻能在exemain工程中打斷點。如果要在dlla上打斷點,需要在gdb終端中手工輸入
set solib-search-path ../../dlla/Debug/
然後輸入b mymax
再就可以用eclipse調試了