真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

GDB的秘密(九)

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

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

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

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

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

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

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

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

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

        下來我們來看看 GDB 應(yīng)用的一個示例,如下

GDB 的秘密(九)

  GDB 的秘密(九)

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

        接下來我們來看看軟件斷點的相關(guān)操作:

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

                        如 a> break func_name [ if var = value ]

                            b> tbreak func_name [ if var = value ]

                2、通過文件名行號設(shè)置斷點:

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

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

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

GDB 的秘密(九)

GDB 的秘密(九)

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

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

GDB 的秘密(九)

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

GDB 的秘密(九)

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

GDB 的秘密(九)

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

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

GDB 的秘密(九)

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

GDB 的秘密(九)

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

GDB 的秘密(九)

        符號查看的示例如下

GDB 的秘密(九)

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


當(dāng)前題目:GDB的秘密(九)
網(wǎng)頁鏈接:http://weahome.cn/article/ijpggg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部