一、在服務器上調試進程,服務器上並沒有源代碼,所以需要將源碼上傳至服務器,才能調試看到源碼,以下是步驟:
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個數