Mascot:射水魚程序員
GDB官網: https://www.gnu.org/software/gdb/ objective-c
GDB適用的編程語言: Ada / C / C++ / objective-c / Pascal 等。shell
GDB的工做方式: 本地調試和遠程調試。編程
目前release的最新版本爲8.0,GDB能夠運行在Linux 和Windows 操做系統上。編程語言
(1)GDB【gnu debuger】是GNU 開源組織發佈的一個強大的UNIX 下的程序調試工具。工具
(2)可以跟蹤程序的執行【execute】,觀察程序運行時內部的狀態;當程序崩潰時【crashed】,查看程序崩潰前的狀態。ui
(1)自定義程序的啓動方式(指定影響程序運行時的參數)spa
(2)設置斷點操作系統
(3)回溯檢查致使程序異常結束的緣由 【core dump】命令行
(4)動態改變程序執行流 【能夠跳過一些代碼以此定位出問題的地方】
(1)軟件不是一次性開發完成的,在軟件開發的任何階段都有可能存在bug
(2)調試是軟件開發中不可或缺的技術,調試工具對於軟件開發很重要
GDB是動態分析工具,binutils工具集是靜態分析工具。
gdb的啓動方式有3種,這3種方式分別適用不一樣的場合下。
這種方式是在GDB內操做可執行程序,能夠在shell命令行輸入gdb <program> 或者進入gdb後輸入file <program>
當程序執行發生異常時,會發生核心轉儲(core dump),產生core文件。能夠使用gdb對core文件進行分析,定位問題所在的文件代碼行。
gdb能夠動態的鏈接到一個進程上,使用以前使用 ps -aux 查看想要鏈接的進程的PID號。
使用 quit / q / crtl +d 退出gdb。
【Tips】 使用GDB前須要完成的工做
(1)在編譯C/C++源碼時,須要添加 -g 選項,將調試信息添加到可執行文件中,供gdb使用
(2)Linux下默認是不產生core文件的,要使用 umilit -c unlimited 命令進行設置,這樣才能產生供gdb使用的core文件
程序斷點就是指處理器指令斷點,通俗的解釋就是:當程序運行到某個地方時,咱們但願程序停下來,即程序「斷了」!停下來的目的,就是讓程序員檢查當前程序運行的狀態。對於軟件開發人員來講,程序斷點是調試程序的必須手段,在嵌入式軟件開發中,對程序斷點進行了區分:軟件程序斷點和硬件程序斷點。
原理:處理器在運行程序的過程當中,若是遇到一條非法的指令就會產生一個異常中斷,程序就會停下來。軟件程序斷點就是利用這個特性來實現的,當咱們設置了一個斷點後,調試工具就在斷點的位置放置一條非法的指令,同時將被替換的指令保留起來。當程序運行到了被非法指令替換的地方時,處理器所產生的異常中斷一方面在中斷服務程序中恢復被替換的指令,另外一方面將控制權交給調試工具。從理論上說,軟件程序斷點能夠設置n個,n的大小由內存容量決定。
在介紹硬件程序斷點時,咱們先要問一問,爲何要引入硬件程序斷點。引入一種新的概念,每每意味着老的概念存在必定的侷限性。那軟件程序斷點存在什麼侷限性呢?想一想看,在嵌入式系統中,若是咱們想調試一個boot loader(參見《什麼是boot loader》一文),而此時處理器還在運行位於FLASH中的程序,此時軟件程序斷點這種方法還有效嗎?固然不行,由於FLASH中的內容並不能像內存同樣,被處理器經過一個寫操做直接更改。在FLASH中更改內容(或稱對FLASH進行編程)存在必定的協議,而顯然處理器不會去實現這一協議的,這會嚴重影響處理器的通用性。此外,即便實現了,其效率也不會高。即然這樣,軟件程序斷點不能運用到boot loader的調試中去。解決方法時什麼呢?就是處理器提供必定的寄存器用於存放程序的斷點位置,當咱們經過調試工具設置斷點時,調試程序會將所需中斷的指令地址放入處處理器的程序中斷寄存器中。顯然,處理器的這種寄存器是有限的,所以,咱們不能設置n個。
原理:
【參考資料】
[1] 程序斷點與數據段點 http://yunli.blog.51cto.com/831344/196353/
[2] ff