本文是手把手教你玩轉GDB的第三篇,主要內容是介紹一些在程序調試過程中最常用的GDB命令,廢話不多話,開始今天的正題。
1. attach process-id/detach:
(1)attach process-id: 在GDB狀態下,開始調試一個正在運行的進程,其進程ID爲process-id
(2)detach: 停止調試當前正在調試有進程,與attach配對試用
2. kill
(1)基本功能:殺掉當前GDB正在調試的應用程序所對應的子進程
(2)如果想不退出GDB而對當前正在調試的應用程序重新編譯、鏈接,可以在GDB中執行kill殺掉子進程,等編譯、鏈接完後,再重新執行run,GDB便可加載新的可執行程序啓動調試
3. 多線程程序調試相關:
(1)thread threadno:切換當前線程到由threadno指定的線程(2)info threads:查看GDB當前調試的程序的各個線程的相關信息
(3)thread apply [threadno] [all] args:對指定(或所有)的線程執行由args指定的命令
4. 多進程程序調試相關(fork/vfork):
(1)缺省方式:fork/vfork之後,GDB仍然調試父進程,與子進程不相關(2)set follow-fork-mode mode:設置GDB行爲,mode爲parent時,與缺省情況一樣;mode爲child時,fork/vfork之後,GDB進入子進程調試,與父進程不再相關
(3)show follow-fork-mode:查看當前GDB多進程跟蹤模式的設置
5. step & stepi:
(1)step [count]: 如果沒有指定count, 則繼續執行程序,直到到達與當前源文件不同的源文件中時停止;如果指定了count, 則重複行上面的過程count次
(2)stepi [count]: 如果沒有指定count, 繼續執行下一條機器指令,然後停止;如果指定了count,則重複上面的過程count次
(3)step比較常見的應用場景:在函數func被調用的某行代碼處設置斷點,等程序在斷點處停下來後,可以用step命令進入該函數的實現中,但前提是該函數編譯的時候把調試信息也編譯進去了,負責step會跳過該函數。
6. next & nexti:
(1)next [count]: 如果沒有指定count, 單步執行下一行程序;如果指定了count,單步執行接下來的count行程序(2)nexti [count]: 如果沒有指定count, 單步執行下一條指令;如果指定了count, 音頻執行接下來的count條執行
(3)stepi和nexti的區別:nexti在執行某機器指令時,如果該指令是函數調用,那麼程序執行直到該函數調用結束時才停止。
7. continue [ignore-count]:
喚醒程序,繼續運行,至到遇到下一個斷點,或者程序結束。如果指定ignore-count,那麼程序在接下來的運行中,忽略ignore-count次斷點。
8. finish & return:
(1)finish: 繼續執行程序,直到當前被調用的函數結束,如果該函數有返回值,把返回值也打印到控制檯
(2)return [expression]: 中止當前函數的調用,如果指定了expression,把expresson值當做當前函數的返回值;如果沒有,直接結束當前函數調用
9. 信號的處理:
(1)info signals & info handle:打印所有的信號相關的信息,以及GDB缺省的處理方式: (2)handle signal action: 設置GDB對具體某個信號的處理方式。signal可以爲信號整數值,也可以爲SIGSEGV這樣的符號。action的取值有:a. stop和nostop: nostop表示當GDB收到指定的信號,不會應用停止程序的執行,只會打印出一條收到信號的消息,因此,nostop也暗含了下面的print; 而stop則表示,當GDB收到指定的信號,停止應用程序的執行。
b. print和noprint: print表示如果收到指定的信號,打印出一條信息; noprint與print表示相反的意思
c. pass和nopass:pass表示如果收到指定的信號,把該信號通知給應用程序; nopass表示與pass相反的意思
d. ignore和noignore: ignore與nopass同義,同理,noignore與pass同義