ref : https://blog.csdn.net/seu_lyr/article/details/9050657
一 暫停程序的運行:
(一)GDB的暫停方式:斷點(BreakPoint)、觀察點(WatchPoint)、捕捉點(CatchPoint)、信號(Signals)、線程停止(Thread Stops)。如果要恢復程序運行,使用continue或c命令。
*GDB中的停止點:斷點(BreakPoint)、觀察點(WatchPoint)、捕捉點(CatchPoint)。
(二)設置斷點:用break命令設置斷點。
*break <function>:在進入指定函數時停住。C++可以使用class::function或function(type,type)(重載)格式來指定函數名。
*break filename:function:在源文件filename的function函數入口處停住。
*break<linenum>:在指定行號停住。
*break filename:linenum:在文件filename的linenum行處停住。
*break +offset和break -offset:在當前行的前或后offset行停住。
*break *address:在程序運行時內存地址address處停住。
*break:沒有參數時,表示在下一條指令處停住。
*break ... if<condition>:...可以是上述參數,condition表示條件,在條件成立時停住。例如:break linenum if i==5.
*查看斷點:info break [n]或info breakpoint [n]。n表示斷點號,[]表示可選,沒有n則顯示全部斷點。
(三)設置觀察點(硬件觀察點和軟件觀察點)watch:用來觀察某個表達式(包括變量)的值是否變化,如果變化,則馬上停止程序。
*watch <expr>:為表達式expr設置一個觀察點,一旦表達式的值有變化,馬上停止程序。
*rwatch <expr>:expr被讀時,停止程序。
*awatch <expr>:當表達式expr的值被讀或被寫時,停住程序。
*info watchpoints:顯示當前設置的所有觀察點。
(四)捕捉點:捕捉程序運行時的一些事件。如:載入共享庫或是C++異常。
1.格式:catch <events>
*當event發生時,停住程序。
*twach<events>:只設置一次捕捉點,當程序停住以后,捕捉點被刪除。
2.events:
(五) 維護停止點:
1.clear:
2.delete:
3.disable:gdb不刪除,需要時再enable即可。
4.enable:
(六)維護停止條件:
1.condition <bnum> <expression>:修改斷點號為bnum的停止條件為expression。
*condition <expression>:清楚斷點為bnum的停止條件。
2.ignore <bnum> <count>:忽略斷點為bnum的停止條件count次。
(七) 為停止點設定運行命令:
(1)利用commands命令設置停止點的運行命令,當程序被停止時,可以讓其自動運行一些別的命令(有利於自動化測試)。
(2)格式:
commands [bnum]
... command-list ...
end
(3)help commands:
(4)例如:
/*在斷點1處打印i的值,並繼續運行程序*/
commands 1
print i
continue
end
(八) 斷點菜單:
(1)在C++中可能有函數重載,這種情況下break<function>不能告訴gdb要停在哪個函數的入口。可以用break <function(type)>指定哪個函數,否則gdb會列出一個斷點菜單供你選擇,這時只需輸入菜單列表的編號即可。
(九) 信號(signals):
(1)信號是一種軟終端,一種處理異步事件的方法。GDB有能力在你調試程序時處理任何一種信號,可以告訴GDB需要處理哪一種信號。要求GDB在收到你所指定的信號時,馬上停住正在運行的程序,供你調試,利用handle命令完成。
(2)handle命令:格式:handle <signal> <actions>,參數見help handle。
(十)線程停止(thread stops):
(1)如果程序是多線程程序可以定義斷點在所有線程上還是在特定線程上。
(2)格式:break <linespec> thread <threadno>或break <linespec> thread <threadno> if ...
*linespec指定斷點設置的源程序的行號。threadno指定線程的ID,注意這個ID是GDB分配的,可通過info threads來查看正在運行程序的線程信息。如果不指定thread <threadno>就將斷點設置在所有線程上。
二 恢復程序的運行:
(1)continue:當程序被停住,可以用continue命令恢復程序的運行直到程序結束,或下一個斷點到來。
(2)next、step、until和finish: