1. 程式人生 > >Linux環境下使用GDB除錯C程式

Linux環境下使用GDB除錯C程式

寫這篇部落格的目的是因為我剛剛用gdb解決了一個c語言中賦錯了值的問題,導致整個程式的執行結果是不正常的,這是我求助於gdb解決了這個問題,之前也用gdb這個神器解決過一些執行時的記憶體問題,比如說c程式中非常常見的segment error。這篇部落格為了對gdb的常用命令做一個備忘,記錄回顧下使用gdb的過程加深記憶。gdb是linux環境下一個非常著名的C語言除錯工具,而且也非常的好用,對於解決C語言的各種bug非常拿手,對於c語言下常見的記憶體問題,可以說能非常快速的定位並解決問題。這篇部落格首先通過介紹gdb的基本使用,後面補充gdb的各種使用命令,我還想列出一些典型的使用環境來做一個總結性的說明,不過這個就留到以後再補充吧,現階段,我對gdb的瞭解還是比較有限的。

1、gdb的基本使用

如果要使用gdb來除錯C應用,在編譯C程式的時候必須加入-g引數,shell命令如下所示:

gcc -g hello.c -o hello

通過這個引數,可以在編譯的時候在程式中加入必要的除錯資訊。突然想起一個問題,沒有加-g引數來除錯會出現什麼情況呢?根據其他人的說法,是看不到變數名等資訊,將會以記憶體中的地址替代,下次有機會試下。

在編譯好之後就可以通過gdb裝載程式來除錯了,啟動gdb的方式就是在shell中直接輸入gdb,要除錯那個程式,就把程式名作為引數跟在命令後面,shell命令如下:

gdb hello

這裡的hello就是上面通過gcc編譯產生的包含有除錯資訊的程式檔案。程式裝載之後並沒有開始真正執行程式,要讓程式執行起來我們才可以觀察程式的執行,要讓程式執行起來可以使用下面的命令:

run

或者

start

這樣編譯好的二進位制檔案就可以運行了。下一步就是,通過一些命令來觀察程式的輸出和執行狀態了。常用的命令有下面這些:

list  #列印執行位置附近的程式原始碼
print #列印指定的變數名的值

然後這裡有非常重要的一點就是斷點的問題,如果程式是因為執行的時候會出現意料之外的情況,而來除錯的話,那麼設定斷點就是必須的了,否則,一執行程式就執行結束了,就來不及觀察了。而通過設定斷點的方式,可以讓程式執行在這個地方的時候暫時停下來,讓我們有機會可以觀察程式的輸入,以找出問題所在。

設定斷點的常用命令有下面這些:

break   #設定斷點,可以簡寫為b
b 10 #設定斷點,在源程式第10行 b func #設定斷點,在func函式入口處

多檔案情況下的斷點設定可以使用下面的命令:

break filename:linenum  #在原始檔filename的linenum行處停住 
break filename:function #在原始檔filename的function函式的入口處停住

查詢所有斷點可以通過下面命令:

info b

2、常用的gdb命令

命令 解釋 示例
r Run的簡寫,執行被除錯的程式。如果此前沒有下過斷點,則執行完整個程式;如果有斷點,則程式暫停在第一個可用斷點處。 (gdb) r
c Continue的簡寫,繼續執行被除錯程式,直至下一個斷點或程式結束。 (gdb) c
b <行號> ; b <函式名稱> ; b <函式名稱> ; b <程式碼地址> ; d [編號] b: Breakpoint的簡寫,設定斷點。兩可以使用“行號”“函式名稱”“執行地址”等方式指定斷點位置。其中在函式名稱前面加“*”符號表示將斷點設定在“由編譯器生成的prolog程式碼處”。如果不瞭解彙編,可以不予理會此用法。d: Delete breakpoint的簡寫,刪除指定編號的某個斷點,或刪除所有斷點。斷點編號從1開始遞增。 (gdb) b 8;(gdb); b main
s, n s: 執行一行源程式程式碼,如果此行程式碼中有函式呼叫,則進入該函式;n: 執行一行源程式程式碼,此行程式碼中的函式呼叫也一併執行。s 相當於其它偵錯程式中的“Step Into (單步跟蹤進入)”;n 相當於其它偵錯程式中的“Step Over (單步跟蹤)”。這兩個命令必須在有原始碼除錯資訊的情況下才可以使用(GCC編譯時使用“-g”引數)。 (gdb) s
si, ni si命令類似於s命令,ni命令類似於n命令。所不同的是,這兩個命令(si/ni)所針對的是彙編指令,而s/n針對的是原始碼。 (gdb) si
p <變數名稱> Print的簡寫,顯示指定變數(臨時變數或全域性變數)的值。 (gdb) p i
i Info的簡寫,用於顯示各類資訊,詳情請查閱“help i”。 (gdb) i r
q Quit的簡寫,退出GDB除錯環境。 (gdb) q
help [命令名稱] GDB幫助命令,提供對GDB名種命令的解釋說明。如果指定了“命令名稱”引數,則顯示該命令的詳細說明;如果沒有指定引數,則分類顯示所有GDB命令,供使用者進一步瀏覽和查詢。 (gdb) help display

相關推薦

Linux環境使用GDB除錯C程式

寫這篇部落格的目的是因為我剛剛用gdb解決了一個c語言中賦錯了值的問題,導致整個程式的執行結果是不正常的,這是我求助於gdb解決了這個問題,之前也用gdb這個神器解決過一些執行時的記憶體問題,比如說c程式中非常常見的segment error。這篇部落格為了對g

UbuntuGDB除錯C語言程式

轉自:http://zhgeaits.me/other/2013/03/17/gdb-study-notes.html,感謝博主。 1.GDB是什麼 GDB是GNU開源組織釋出的一個UNIX下的程式除錯工具,專門用來除錯C,C++這些程式的了,而且都是命令列模式的。 2.準備工作 平

linux環境vscode 中C/C++編譯及除錯環境的搭建

0.確定安裝了GCC,沒有安裝的話sudo apt-get install gcc1.下載vscode並安裝,建議deb包2.開啟vscode,安裝擴充套件外掛,其中C/C++為必裝,提供C/C++支援Code Runner必裝,提供編譯後程序的執行環境C/C++ Snipp

Linux環境,VSCode C++環境配置

作為在Windows環境下習慣使用Visual Studio IDE的人,對於Linux環境下的Vim編輯使用十分難受,雖然網上很多人說vim非常牛逼和強大,但是我更加習慣於使用VS code的介面,所以我選擇VS code作為編輯器使用。 VS code本身是一個編輯器,所以如果需要除錯等功能需要自己安裝

Linux入門級gdb除錯--C/C++語言

Linux上面一般使用gdb來進行程式碼的除錯,除錯我目前知道的方法是:首先將寫好的LinuxC/C++程式碼編譯成可執行檔案,注意編譯的時候生成目標檔案.o的時候必須加上-g引數,-g引數是表示生成的.o檔案是包含有列印資訊的,如果不加的話,無法進行除錯,因為沒有任何列印資訊。下面我將根據一個

在桌面Linux環境開發圖形介面程式的方案對比

在Linux下開發GUI程式的方法有很多,比如Gnome桌面使用GTK+作為預設的圖形介面庫,KDE桌面使用Qt作為預設的圖形介面庫,wxWidgets則是另一個使用廣泛的圖形庫,此外使用Java中的Swing/AWT元件也可以用於開發Linux下的GUI應用。 本文將依次

linux環境編譯執行OpenCV程式的兩種方法

  原來以為在Ubuntu下安裝好了OpenCV之後,自己寫個簡單的程式應該很容易吧,但是呢,就是為了編譯一個簡單的顯示圖片的程式我都快被弄崩潰了。   在谷歌和上StackOverFlow檢視相關問題解答之後,我下面就介紹Command Line和CMake兩種方式。

gdb除錯C++程式時列印變數的值

如果這個值是本地變數,那麼沒有任何的問題。gud-tooltip-mode也能正確顯示。不過如果是類裡的成員,有的時候就麻煩了。據我目前的觀察,有的時候gdb可以正確的找到當前類的繼承關係,可以直接使用this來訪問相關資訊:p *this: 打印出當前類裡所有的成員的值p this->member:

使用gdb除錯c++程式

  上篇(使用c++開發跨平臺程式)說到,我不怕造東西,我怕的是造出來的東西,如果出了問題,我卻不知道原因.所以除錯分析是一個重要的手段. C++除錯是一個複雜的活.雖然大部分除錯可以通過IDE在開發期間就解決了.但是必然的,還有很多東西需要在生產環境中還原它.分析它,然後解決它.gdb是一個成熟的

Linux使用gdb除錯C/C++程式

在筆者工作實踐中,使用gdb除錯C++程式和除錯C程式,他們稍有不同,下面是使用總結。 一、編譯選項 -g         生成除錯資訊 -gstabs+   以stabs格式生成除錯資訊,並且包含僅供gdb使用的額外除錯資訊生成除

C語言編寫Copy程式Linux環境的操作)

COPY程式的編寫 (作者:Baron_wu 禁止轉載) 一、實驗描述 在這個實驗中,我們要做一個程式,這個程式是將一個檔案的內容複製到一個目標檔案。首先這個程式提示使用者輸入要複製的原始檔案的名字,以及要複製到的目標檔案的名字。 確保包括必要的錯誤檢查,包括確保原始檔案存在

Linux環境c程式的編譯和執行

1 單個檔案的編譯和執行建立main.c檔案,內容如下: #include <stdio.h> #include <stdlib.h> int main(void){ printf("Hello world!\n"); return 0; };   編譯:

Linux環境如何編譯和執行c程式

1 單個檔案的編譯和執行 建立main.c檔案,內容如下:  編譯: 執行: 2 多個檔案的編譯和執行建立sum.c檔案,內容如下: 建立main.c檔案,內容如下:   編譯:    生成可執行檔案,檔名為main: 執行程式:

linux環境編譯C++ 程式

在linux環境下編譯C++ 程式 單個原始檔生成可執行程式 下面是一個儲存在檔案 helloworld.cpp 中一個簡單的 C++ 程式的程式碼: 單個原始檔生成可執行程式 /* helloworld.cpp */ #include <iostream> int main

C語言程式的編譯、連結具體過程及Linux環境的具體例項

我們知道一個C語言程式從編寫完成到生成可執行檔案分為預處理、編譯、彙編、連結,最後再生成可執行檔案。 預處理階段 前處理器主要做四部分工作,分別是:標頭檔案展開、巨集替換、去註釋以及條件編譯。 (1)標頭檔案展開就是編譯器會根據字元#開頭的命令去讀取相

C語言linux環境使用gettimeofday函式得到程式執行時間

編寫的一個打字遊戲中需要計算程式的執行時間,通過網上查閱資料發現大多數都是說通過clock()函式來獲取時間,之後做差從而的到程式的執行時間。但是在linux中測試以後發現結果是0,並不能得到程式的執行時間。 請教老師後得知可以通過引用標頭檔案time.h,使

linux環境c++的編寫、除錯以及makefile多檔案連編需要注意的問題

最近剛開始接觸Linux C++,發現其與windows C++有太大的差別。這裡是自己的一些總結,如果有新人看到,希望能夠幫到您。 1、gcc編譯器簡介 生成一個.out需要將原始檔依次進行預處理、

Linux環境使用eclipse開發C++動態連結庫程式

Linux中也有類似windows中DLL的變成方法,只不過名稱不同而已。在Linux中,動態連結叫做Standard Object,生成的動態連結檔案為*.so。詳細請參考相關文件。 開發環境:Eclipse 3.4.2 G++:4.3.2 1. 建立動態連結庫

linux環境C語言實現非阻塞方式讀取字串資料的串列埠測試程式,即串列埠工具的編寫

一、前言 1.1 關於串列埠測試工具,網上已經有整合好的應用程式提供大家使用,但其只提供功能介面,內部具體怎麼實現的還需要自己去探索; 1.2 關於串列埠通訊的測試程式在網上已經是數見不鮮,但也不排除很多是直接“參考”別人的(ctrl+c),而且很多程式

Linux環境編寫C程序

gcc gdb Linux環境下編寫包括頭文件C程序出 一:gcc編譯鏈接用法:gcc [選項] 文件...選項:-pass-exit-codes 在某一階段退出時返回最高的錯誤碼--help 顯示此幫助說明--target-help