1. 程式人生 > >GDB除錯進階

GDB除錯進階

  1. 開發機中編譯帶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;

                     cp libSearcherRank-80.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。