GDB的秘密(九)

        在上節(jié)博客中,我們學習了鏈接器的知識。那么本節(jié)課我們繼續(xù)學習嵌入式開發(fā)中的一些常用的操作,今天我們學習的是在 GNU 開發(fā)中,必不可少的調試利器 GDB??赡芨愕讓拥耐净蚨嗷蛏俚穆犨^ GDB,但是覺得它總是那么的神秘,很模糊。那么我們今天就來看看 GDB。

創(chuàng)新互聯(lián)專注于長沙縣網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經驗。 熱誠為您提供長沙縣營銷型網(wǎng)站建設,長沙縣網(wǎng)站制作、長沙縣網(wǎng)頁設計、長沙縣網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務,打造長沙縣網(wǎng)絡公司原創(chuàng)品牌,更為您提供長沙縣網(wǎng)站排名全網(wǎng)營銷落地服務。

        先從它的概念開始介紹,什么是 GDB 呢?它是 GNU項目中的調試器(gnu debuger),它的作用是能追蹤程序的執(zhí)行,也能恢復程序崩潰前的狀態(tài)。那么我們?yōu)槭裁葱枰?GDB 呢?在我們日常的軟件開發(fā)中,難免會寫出一些難以發(fā)現(xiàn)的 bug,那么這些 bug 又是曇花一現(xiàn),馬上就結束了。我們來不及反應程序就崩潰了,因此我們找不到 bug 的來源。因此我們需要在軟件開發(fā)的過程中進行調試,這也便是 gdb 的由來。

        下來我們來看看 GDB 的一些常規(guī)性應用,一般包括以下幾方面:

                1、自定義程序的啟動方式(指定影響程序運行的參數(shù));

                2、設置條件斷點(在條件滿足時暫停程序的執(zhí)行);

                3、回溯檢查導致程序異常結束的原因(Core Dump);

                4、動態(tài)改變程序執(zhí)行流(定位問題的輔助方式)。

        那么 GDB 又是怎樣進行啟動的呢?它的啟動方式可以大致分為兩種:直接啟動和動態(tài)連接。直接啟動又分為三種:gdb;   gdb test.out;   gdb test.out core;  動態(tài)連接:gdb test.out pid

        下來我們來看看 GDB 應用的一個示例,如下

GDB 的秘密(九)

  GDB 的秘密(九)

        介紹了它的啟動方式后,我們再來看看用它如何進行斷點調試。在介紹斷點調試之前,我們首先來看看在 GNU 中的斷點類型。它分為三種:軟件斷點、硬件斷點、數(shù)據(jù)斷點。軟件斷點是由非法指令異常實現(xiàn)的(也即是通過軟件實現(xiàn)),硬件斷點和數(shù)據(jù)斷點則是由硬件特性實現(xiàn)(共同的特點是數(shù)量有限)。

        接下來我們來看看軟件斷點的相關操作:

                1、通過函數(shù)名設置斷點:

                        如 a> break func_name [ if var = value ]

                            b> tbreak func_name [ if var = value ]

                2、通過文件名行號設置斷點:

                        如 a> break func_name:line_num [ if var = value ]

                            b> tbreak func_name:line_num [ if var = value ]

        上面的 break 和 tbreak 兩種方式的區(qū)別是,tbreak 設置的是臨時斷點,而 break 設置的則是永久斷點。下面我們繼續(xù)來看看斷點操作的一些常用命令

GDB 的秘密(九)

GDB 的秘密(九)

        介紹了軟件斷點的相關操作之后,我們來繼續(xù)介紹硬件斷點的操作及應用。那么我們是在什么樣的情況下才會去使用硬件斷點呢?1、當代碼位于只讀存儲器(Flash)時,只能通過硬件斷點調試;2、硬件斷點需要硬件支持,數(shù)量有限;3、GDB 中通過 hbreak 命令支持硬件斷點;4、hbreak 與 break 的使用方式是完全一致的。

        我們先來看看數(shù)據(jù)斷點:在 GDB 中支持數(shù)據(jù)斷點的設置,watch 命令用于監(jiān)視變量是否被改變(其本質也為硬件斷點)。watch 命令的用法:watch var_name,在 GDB 中可以檢查任意內存區(qū)域中的數(shù)據(jù)。命令語法:x /Nuf experssion ,其中 N 是需要打印的單元數(shù),u 指的是每個單元的大小,f 指的是數(shù)據(jù)打印的格式。我們來看看 x 命令中參數(shù) u 對應的單位,如下所示

GDB 的秘密(九)

        接下來我們來看看 GDB 中的打印格式,如下圖所示

GDB 的秘密(九)

        在這塊我們可以利用這個特性用來判斷系統(tǒng)大小端,示例代碼如下

GDB 的秘密(九)

        如果是上面的那種情況,那么此系統(tǒng)就是小端;反之則是大端。接下來看看函數(shù)調用棧的查看(backtrace 和 frame)。

        backtrace 是用來查看函數(shù)調用的順序(函數(shù)調用棧的信息);frame N 則是切換到棧編號為 N 的上下文中;info frame 是用來查看當前函數(shù)站調用的棧幀信息的。棧幀信息就是我們之前在 C 語言中講到的函數(shù)活動記錄,如下

GDB 的秘密(九)

        我們再來深入的看看 info 命令,如下

GDB 的秘密(九)

        那么在調試中還有一些小技巧,比如在斷點處自動打?。篸isplay /f expression,相應的去除打印就是:undisplay;查看程序中的符號:whatis,ptype;GDB 中的代碼查看:list,set listsize N;GDB 中的 shell 操作:shell??纯磾帱c出自動打印的示例,如下

GDB 的秘密(九)

        符號查看的示例如下

GDB 的秘密(九)

        通過今天對 GDB 的學習,總結如下:1、GDB 支持數(shù)據(jù)斷點的設置(一種類型的硬件斷點);2、watch 用于監(jiān)視變量是否被改變,x 用于查看內存中的數(shù)據(jù);3、GDB 支持函數(shù)調用棧的查看(backtrace,info frames);4、GDB  支持運行時對程序中的符號進行查看(whatis,ptype)。

當前文章:GDB的秘密(九)
URL標題:http://bm7419.com/article16/ijpggg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設網(wǎng)站維護、商城網(wǎng)站網(wǎng)站改版、手機網(wǎng)站建設、外貿建站

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設計公司