萌新救火接手了乙個比較大的框架,要從開發機把編譯好的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這種依賴位址的程式無法正...