《軟體除錯藝術》讀後感六

2021-07-03 03:32:10 字數 1711 閱讀 5161

在gdb中,可以通過呼叫info locals命令得到當前桟幀中的所有區域性變數的值的列表。

在有些情況下,可能希望檢查給定位址的記憶體,而不是通過變數的名稱。gdb為這種目的提供x命令。

print和display的高階選項,print和display命令允許指定可選的格式。例如p /x y,這樣會以十六進製制格式顯示,而不是十進位制格式,其它常用的格式為c(字元),s(字串),f(浮點數)。

如果你想禁用某乙個選項,gdb提供了dis命令,dis disp number如果條目你不記得,那你一定要使用info disp來檢視條目。大家知道,如果有禁止,就肯定會有啟用,啟用命令當然是大家熟知的enable,如enable disp number,如果想完全刪除某個條目,那麼就要是用命令undisplay 如undisp number。

gdb測試時使用set命令對變數賦值,比如 set x=12,這就是將x的值設定成12。gdb中可以使用set args命令設定程式的命令列引數。在呼叫run命令檢查函式引數的命令info args。gdb還可以定義自己的變數,gdb的print命令的輸出值被標為$1,$2。這些值統稱為值歷史。如$1=(struct node*)0x80496a8àprint tmp->left

在除錯鍊錶時,有時需要檢視鍊錶中的每個結點的值,這時可以使用gdb中的方便變數:設乙個指標變數p,它在不同的時候指向鍊錶中的不同節點,可以記錄這個結點的值為set $q = p,後可以執行p *$q。這裡的變數$q稱為方便變數(convenience variable)。例如:

w[4] =

set $i = 0

p w[$i++]

程式崩潰一般是由於未經允許,訪問了記憶體單元,也就是我們常常看見的段錯誤,相信大家對段錯誤(segment default)並不陌生。

作業系統有時傳送訊號給程式,訊號傳送的機制是作業系統將訊號記錄在程序表中,而不是實際上的傳送訊號。作業系統中的每種訊號代表了不同的含義:

sigfde訊號:浮點異常導致、算數異常、溢位或除0,匯流排錯誤、對齊問題,物理記憶體不存在對應的訊號是sigbus訊號,sigbus會導致轉存記憶體並終止。

大家應該都看到過這個檔案,特別是那些使用gdb對安卓系統中的軟體進行gcore的時候見的最多了,不過那個不是程式崩潰了,而是為了分析**。有些訊號表示讓某個程序繼續是妥當,甚至是不可能的,在這種情況下,預設動作是提前終止程序,並編寫乙個名為核心檔案(core file)的檔案,俗稱轉儲核心。

核心檔案包含程式崩潰時對程式狀態的詳細描述,桟的內容(或者,如果程式是多執行緒的,則是各個執行緒的桟),cpu暫存器的內容(多執行緒,則是執行緒的一組暫存器的值),程式靜態分配變數的值(全域性與static變數)

file core可以檢視這個特定核心檔案的名稱,在bash中,可以使用ulimit命令控制核心檔案的建立。如:

ulimit –c n : n是核心檔案的最大大小,以千位元組為單位,超過nkb的任何核心檔案都不會被寫。如果是建立任意大小的核心檔案則:

ulimit –c unlimited,ulimit – c可以檢查核心檔案。

如果使用vim進行工程開發,是不是每次退出vim進行make比較麻煩,這裡有個技巧可以避免退出vim,適用於單個沒有makefile的**,或者是有makefile的工程。在vim的命令列直接輸入:make就可以直接編譯了,如果程式有錯誤,可以使用:cnext或者cprev命令檢視錯誤。有沒有覺得很方便。

《軟體除錯藝術》讀後感三

在談這個問題前我們有沒有遇到過這樣的場景,每次要修改一次 然後make,之後gdb除錯,然後出gdb中quit,再次修改再次make再次gdb進入再次quit一直重複著乙個工作。那有沒有方法可以避免這樣的重複事情呢?畢竟程式設計師對這種重複的步驟很反感。在實際專案中,乙個專案不可能一天就能完成,有時...

《軟體除錯藝術》讀後感四

只有符合某種條件時才在斷點處停止。類似於監視點的工作方式,每當該變數的值發生變化時,監視點都會中斷。條件斷點只會在懷疑有問題的 處當變數呈現該懷疑值時才中斷。設定條件斷點 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會暫停程式的執行。斷點與源 中的...