關於「gdb無法打斷點」的分析與解決辦法

2021-08-27 14:02:31 字數 1135 閱讀 3831

萌新救火接手了乙個比較大的框架,要從開發機把編譯好的bin\so,以及data放到測試機部署並發布。

gdb對已經啟動的程序除錯

首先,要在測試機上跑起來編寫的http和tcp服務,與平時不一樣的是,這裡gdb是對於系統以及跑起來的程序直接除錯,採用

ps -ef | grep ***
來查對應的pid,用

gdb -p ***xx
即可對改程序(服務)進行除錯。

2 . gdb無法打上斷點

進入gdb,直接給出了

warning: could not load shared library symbols for 7 libraries, e.g. ***x.so.

開始懷疑了跨機器(不同發行版本系統)直接直接部署問題,路徑問題等。

直接說解決辦法:

2.1 查cmake是否生成debug版本makefile,debug要比release大5、6倍,可以簡單看一下

cmake -dcmake_build_type=debug ..
2.2 在gdb上

info sharedlibrary
檢視到底是哪些有關的symbols沒載入上。如下圖:

liblog4cxx.so.10是乙個log相關的so,我不需要除錯,斷點也不會在這裡,所以syms read是no也無所謂;但是libgeo_new.so是我需要除錯的,如果系統因為某些原因真的沒法正確載入,可以用

set solib-search

-path /home/***/workspace/geo/searchengine/src/onlinesearch/build/bin

指定編譯生成的這個so的目錄,此時再看 info sharedlibrary

已經成功讀取了so檔案

或者,你可以在有這個so檔案的目錄下直接gdb

總結:

1、確保debug版本編譯

2、找到正確的路徑去除錯或者指定

C 關於gdb斷點的真相

因此,只要斷點不被走到,那麼斷點就不會影響程式的執行效率 因為程式的其他地方都沒改變,該怎麼執行還是怎麼執行。包括 停下來等使用者處理 自動繼續 自動執行一些gdb指令 用commands命令可以配置斷點的自動執行 判斷條件是否要停下來 這就是大名鼎鼎的條件斷點 因為通常到了斷點就會通過int3停下...

C 關於gdb斷點的真相

因此,只要斷點不被走到,那麼斷點就不會影響程式的執行效率 因為程式的其他地方都沒改變,該怎麼執行還是怎麼執行。包括 停下來等使用者處理 自動繼續 自動執行一些gdb指令 用commands命令可以配置斷點的自動執行 判斷條件是否要停下來 這就是大名鼎鼎的條件斷點 因為通常到了斷點就會通過int3停下...

docker使用GDB,無法進入斷點的解決方法

docker裡執行gdb,打了斷點,卻無法進入斷點 docker為了保證主機安全,docker開了很多安全設定,其中包括aslr address space layout randomization 即docker裡的記憶體位址和主機記憶體位址是不一樣的。aslr會導致gdb這種依賴位址的程式無法正...