gdb調試已在運行中的進程


一、在服務器上調試進程,服務器上並沒有源代碼,所以需要將源碼上傳至服務器,才能調試看到源碼,以下是步驟:

1、查看服務進程id:pgrep 服務名

[user@user-MP app]$ pgrep progream_svr
5111

2、啟動gdb:gdb progream_svr 5111

3、設置源碼映射

set substitute-path /home/ahwen/workspace/PssSeatDcs/Pss_Seat_Cstl /home/tode/others/others/Pss_Seat_Cstl

源碼路徑:/home/ahwen/workspace/PssSeatDcs/Pss_Seat_Cstl

實際代碼路徑:/home/tode/others/others/Pss_Seat_Cstl

用實際代碼替換源碼,此過程需要包版本和代碼版本一致。

4、設斷點:

b TmXxxCondition.cpp:128

調試文件:TmXxxCondition.cpp

斷點:128行

5、已是運行中的程序不需要啟動(r),繼續(c)即可。

6、等待指令或報文觸發斷點,被擊中會停留在斷點行。

二、gdb常用指令:

gcc -g  main.c                      //在目標文件加入源代碼的信息
gdb a.out       

(gdb) start                         //開始調試
(gdb) n                             //一條一條執行
(gdb) step/s                        //執行下一條,如果函數進入函數
(gdb) backtrace/bt                  //查看函數調用棧幀
(gdb) info/i locals                 //查看當前棧幀局部變量
(gdb) frame/f                       //選擇棧幀,再查看局部變量
(gdb) print/p                       //打印變量的值
(gdb) finish                        //運行到當前函數返回
(gdb) set var sum=0                 //修改變量值
(gdb) list/l 行號或函數名             //列出源碼
(gdb) display/undisplay sum         //每次停下顯示變量的值/取消跟蹤
(gdb) break/b  行號或函數名           //設置斷點
(gdb) continue/c                    //連續運行
(gdb) info/i breakpoints            //查看已經設置的斷點
(gdb) delete breakpoints 2          //刪除某個斷點
(gdb) disable/enable breakpoints 3  //禁用/啟用某個斷點
(gdb) break 9 if sum != 0           //滿足條件才激活斷點
(gdb) run/r                         //重新從程序開頭連續執行
(gdb) watch input[4]                //設置觀察點
(gdb) info/i watchpoints            //查看設置的觀察點
(gdb) x/7b input                    //打印存儲器內容,b--每個字節一組,7--7組
(gdb) disassemble                   //反匯編當前函數或指定函數
(gdb) si                            // 一條指令一條指令調試 而 s 是一行一行代碼
(gdb) info registers                // 顯示所有寄存器的當前值
(gdb) x/20 $esp                    //查看內存中開始的20個數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM