在談這個問題前我們有沒有遇到過這樣的場景,每次要修改一次**,然後make,之後gdb除錯,然後出gdb中quit,再次修改再次make再次gdb進入再次quit一直重複著乙個工作。那有沒有方法可以避免這樣的重複事情呢?畢竟程式設計師對這種重複的步驟很反感。
在實際專案中,乙個專案不可能一天就能完成,有時電腦還是要關機,關機可能是主動,也可能是被動。這樣重啟之後之前設定的斷點都會消失,這時我們可以將我們歸納的除錯全部寫進.gdbinit檔案中,這個檔案的位置已經在前面介紹過,不記得的可以翻閱前面的文章。
刪除斷點或監視點可以使用delete命令,命令格式如下:
deletebreakpoint-list
delete不加引數是刪除所有的斷點,但是需要確認,以避免你是誤操作,如果不需要確認,則需要在.gdbinit啟用檔案中寫入set confirmoff關閉確認功能。
clear function、filename:function、line-number和filename:line-number。每個斷點都可以被啟用或禁止。只有當gdb遇到啟用的斷點時,才會暫停程式的執行,它會忽略禁止的斷點。
disable breakpoint-list命令來禁用斷點,使用enable breakpoint-list命令來啟用斷點,breakpoint-list使用空格分隔符的列表。
不帶任何引數地執行disable命令將禁止所有斷點。不帶任何引數的enable命令將啟用所有斷點。enable once命令是啟用一次,執行一次後將會處於禁止狀態。
所以斷點的部署分為三個狀態:keep(保持)、del(刪除)和dis(禁用)。
next稱為單步越過,step是單步進入。next(n)命令執行函式,不會在其中暫停,也就是不會進入函式體的內部。這個命令和step(s)命令都是單步除錯,但是s命令會進入函式的內部。如:
a = 5;
b = 10;
result = add(a,b);
printf(「%d\n」, result);
如果是next進行除錯,next不會進入add函式,它會暫停在printf語句處,如果使用step命令,則會暫停在add函式的第一條語句。nextcount相當於單獨執行了count次next命令,而continue count的意思是忽略接下來的count個斷點。
fin 命令:指示gdb恢復執行,知道恰好在當前桟幀完成之後為止,恰當函式返回之後為止。
until恢復程式執行,until命令(u)通常用來在不進一步在迴圈中暫停的情況下完成正在執行的迴圈。用法如下:
until count、until function、until filename:line-number、until filename:function
《軟體除錯藝術》讀後感四
只有符合某種條件時才在斷點處停止。類似於監視點的工作方式,每當該變數的值發生變化時,監視點都會中斷。條件斷點只會在懷疑有問題的 處當變數呈現該懷疑值時才中斷。設定條件斷點 breakbreak args if conditon 如 break if i 700 condition 6999 條件可以...
《軟體除錯藝術》讀後感五
監視點是指示gdb每當某個表示式改變了只,就暫停執行指令。如watch i它會使得每當i改變值時gdb就暫停。也可以使得watch後面的更複雜如 watch i j 2 i 24 strlen name 6這是將監視點看作 附加 在表示式上,當表示式的值改變時,gdb會暫停程式的執行。斷點與源 中的...
《軟體除錯藝術》讀後感六
在gdb中,可以通過呼叫info locals命令得到當前桟幀中的所有區域性變數的值的列表。在有些情況下,可能希望檢查給定位址的記憶體,而不是通過變數的名稱。gdb為這種目的提供x命令。print和display的高階選項,print和display命令允許指定可選的格式。例如p x y,這樣會以十...