中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

GDB 的秘密(九)

發布時間:2020-07-19 14:15:40 來源:網絡 閱讀:364 作者:上帝之子521 欄目:系統運維

        在上節博客中,我們學習了鏈接器的知識。那么本節課我們繼續學習嵌入式開發中的一些常用的操作,今天我們學習的是在 GNU 開發中,必不可少的調試利器 GDB。可能搞底層的同志或多或少的聽過 GDB,但是覺得它總是那么的神秘,很模糊那么我們今天就來看看 GDB。

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

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

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

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

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

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

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

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

GDB 的秘密(九)

  GDB 的秘密(九)

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

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

                1、通過函數名設置斷點:

                        如 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 兩種方式的區別是,tbreak 設置的是臨時斷點,而 break 設置的則是永久斷點。下面我們繼續來看看斷點操作的一些常用命令

GDB 的秘密(九)

GDB 的秘密(九)

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

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

GDB 的秘密(九)

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

GDB 的秘密(九)

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

GDB 的秘密(九)

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

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

GDB 的秘密(九)

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

GDB 的秘密(九)

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

GDB 的秘密(九)

        符號查看的示例如下

GDB 的秘密(九)

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

堆龙德庆县| 宁蒗| 汉阴县| 腾冲县| 文山县| 尼玛县| 大渡口区| 安义县| 通山县| 石狮市| 克什克腾旗| 磴口县| 江安县| 武平县| 武威市| 津市市| 南涧| 土默特右旗| 西乌珠穆沁旗| 新源县| 军事| 阿拉善左旗| 环江| 平陆县| 七台河市| 清丰县| 宜都市| 水富县| 金塔县| 八宿县| 简阳市| 武汉市| 海盐县| 抚顺市| 广平县| 中卫市| 海丰县| 芜湖县| 策勒县| 上栗县| 镇原县|