GDB除錯進階
- 開發機中編譯帶debug資訊的動態庫
cd jd_search_rank
mkdir debug
cd debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make
2. 將so檔案以及debug版本的原始碼上傳到預發機中
reload so — 例如,xtest=80
原始碼解壓到某個目錄下 – 例如,/home/admin/yuzhan/jd_search_rank/
3. 查詢被刪除的臨時so檔案, 將其恢復
原因:
引擎載入指定的so時, 先將so copy一份,然後再使用copy後的檔案,函式退出的時候執行析構再刪除該檔案;
gdb在編譯時會在檔案系統內搜尋要用的檔案;
如果指定so不存在,則只能報棧的呼叫位置;
如果指定so不是debug版本的,則可知出錯的函式名;
如果指定so是debug版本的,則可知函式內出錯的行數;
如果預發機上有編譯so的原始碼,則gdb可呈現出錯的程式碼;
因此,我們需要將刪除的臨時so檔案恢復,並且將編譯so的原始碼拷到預發機中。
方法:
ps aux | grep searcher_server – 例如,searcher_server的程序號為16969;
pmap -x 16969 | grep Rank-80.so – 例如,臨時so檔名稱為 libSearcherRank-80.so_1542968790;
4. gdb -p 16969
注意,執行命令之後. searcher或者merer程序就被掛起了,無法響應request。
5. 設定原始碼路徑
編譯原始碼的路徑為:/export/users/yuzhan/debug/jd_search_rank;
預發機上原始碼的路徑為:/home/admin/yuzhan/jd_search_rank;
那麼要在gdb裡設定替換原始碼路徑,因為存在編譯路徑不同導致找不到程式碼目錄;
(gdb) set substitute-path /export/users/yuzhan/debug/jd_search_rank /home/admin/yuzhan/jd_search_rank
6. debug
(gdb): b CategoryDiversityRank.cpp:25 (設定斷點)
(gdb): continue
傳送request,等待gdb斷點觸發。
除錯完成後,退出gdb或者detach。