1. 程式人生 > >Linux GDB除錯完全教程

Linux GDB除錯完全教程

本文將主要介紹linux下的強大除錯工具是怎麼完成這些工作的。

之所以要除錯程式,是因為程式的執行結果和預期結果不一致,或者程式出現執行時錯誤。 
除錯的基本思想是: 
分析現象 -> 假設錯誤原因 -> 產生新的現象去驗證假設

偵錯程式(如GDB)的目的是允許你在程式執行時進入到某個程式內部去看看該程式在做什麼,或者在該程式崩潰時它在做什麼。

GDB主要可以做4大類事(加上一些其他的輔助工作),以幫助使用者在程式執行過程中發現bug。 
* 啟動您的程式,並列出可能會影響它執行的一些資訊 
* 使您的程式在特定條件下停止下來 
* 當程式停下來的時候,檢查發生了什麼 
* 對程式做出相應的調整,這樣您就能嘗試糾正一個錯誤並繼續發現其它錯誤

您能使用GDB除錯用C、C++、Modula-2寫的程式等GNU Fortran編譯器準備好過後,GDB將提供對Fortran的支援

gdb引數選項詳解

gcc除錯相關編譯選項

GDB通過在命令列方式下輸入gdb來執行。啟動過後,GDB會從終端讀取命令,直到您輸入GDB命令quit使GDB退出。您能通過GDB命

  1. gcc -g main.c  


gdb主要除錯的是C/C++的程式。要除錯C/C++的程式,首先在編譯時,必須要把除錯資訊加到可執行檔案中。使用編譯器(cc/gcc/g++)的 -g 引數即可。如: 
如果沒有-g,將看不見程式的函式名和變數名,代替它們的全是執行時的記憶體地址。當用-g把除錯資訊加入,併成功編譯目的碼以後,看看如何用gdb來除錯。

要用gdb除錯程式,必須在編譯時加上-g和-ggdb選項,-g選項的作用是在可執行檔案中加入原始檔資訊,但並不是將原始檔嵌入可執行檔案,所以在除錯時必須保證gdb必須能找到原始檔.

-g 和 -ggdb 都是令 gcc 生成除錯資訊,但是它們也是有區別的

選項 描述
g 該選項可以利用作業系統的“原生格式(native format)”生成除錯資訊。GDB 可以直接利用這個資訊,其它偵錯程式也可以使用這個除錯資訊
ggdb 使 GCC為GDB 生成專用的更為豐富的除錯資訊,但是,此時就不能用其他的偵錯程式來進行除錯了 (如 ddx)

-g 和 -ggdb 也是分級別的

選項 描述
g1 級別1(-g1)不包含區域性變數和與行號有關的除錯資訊,因此只能夠用於回溯跟蹤和堆疊轉儲之用。回溯跟蹤指的是監視程式在執行過程中的函式呼叫歷史,堆疊轉儲則是一種以原始的十六進位制格式儲存程式執行環境的方法,兩者都是經常用到的除錯手段
g2 這是預設的級別,此時產生的除錯資訊包括擴充套件的符號表、行號、區域性或外部變數資訊
g3 包含級別2中的所有除錯資訊,以及原始碼中定義的巨集

gdb引數選項(啟動)

啟動gdb的標準命令如下

  1. gdb    [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps]  
  2.           [-tty=dev] [-s symfile] [-e prog] [-se prog] [-c core]  
  3.           [-x cmds] [-d dir] [prog[core|procID]]  


您能以無引數無選項的形式執行GDB,不過通常的情況是以一到兩個引數執行GDB,以待除錯的可執行程式名(-se指定)為引數和core dump檔案(-c指定)

但是我們啟動的時候,往往不需要指定-se和-c, 因為如果啟動gdb時候提供了引數, 那麼任何引數而非選項指明瞭一個可執行檔案及core 檔案(或者程序ID)

  • 所遇到的第一個未關聯選項標誌的引數與 ‘-se’ 選項等價
  • 第二個,如果存在,且是一個檔案的名字,則等價與 ‘-c’ 選項。

許多選項都有一個長格式與短格式;都會在這裡表示出來。如果你把一個長格式截短,只要不引起歧義,那麼它還是可以被識別。(如果你願意,你可以使用 ‘+’ 而非 ‘-’ 標記選項引數,不過我們在例子中仍然遵從通常的慣例)

選項 描述
gdb 程式名, gdb 程式名 core 您能用兩個引數來執行GDB,可執行程式名與core檔案
gdb 程式名 1234 您可以以程序ID作為第二個引數,以調式一個正在執行的程序, 將會把gdb附在程序1234之上(除非您正好有個檔案叫1234,gdb總是先查詢core檔案)

啟動gdb的方法有以下幾種: 
1. gdb 
program也就是執行檔案,一般在當前目錄下。 
所遇到的第一個未關聯選項標誌的引數與 ‘-se’ 選項等價 
因此等價於gdb -se

  1. gdb core

用gdb同時除錯一個執行程式和core檔案,core是程式非法執行後,core dump後產生的檔案。 
相當於 gdb -se -c core

  1. gdb

如果程式是一個服務程式,那麼可以指定這個服務程式執行時的程序ID。gdb會自動attach上去,並除錯它。program應該在PATH環境變數中搜索得到。

gdb引數選項

選項 簡寫 描述
-help -h 列出所有選項,並附簡要說明
-symbols=file -s file 讀出檔案(file)中的符號表
-write 開通(enable)往可執行檔案和核心檔案寫的許可權
-exec=file -e file 在適當時候把File作為可執行的檔案執行,來檢測與core dump結合的資料
-se File 從指定檔案中讀取符號表資訊,並把它用在可執行檔案中
-core File -c File 把File作為core dump來執行,除錯時core dump的core檔案。
-command=File -x File 從File中執行GDB命令
-directory=Directory -d Directory 把Dicrctory加入原始檔搜尋的路徑中,加入一個原始檔的搜尋路徑。預設搜尋路徑是環境變數中PATH所定義的路徑
-nx -n 不從任何.gdbinit初始化檔案中執行命令。通常情況下,這些檔案中的命令是在所有命令選項和引數處理完後才執行
-quiet -q “Quiet”.不輸入介紹和版權資訊。這些資訊輸出在batch模式下也被關閉
-batch 執行batch模式。在處理完所有用’-x’選項指定的命令檔案(還有’.gdbi-nit’,如果沒禁用)後退出,並返回狀態碼0.如果在命令檔案中的命令被執行時發生錯誤,則退出,並返回狀態碼非0.batch模式對於執行GDB作為過濾器也許很有用,比如要從另一臺電腦上下載並執行一個程式;為了讓這些更有用,當在batch模式下執行時,訊息:Program exited normally.(不論什麼時候,一個程式在GDB控制下終止執行,這條訊息都會正常發出.),將不會發出
-cd=Directory 執行GDB,使用Directory作為它的工作目錄,取代當前工作目錄
-fullname -f 當Emacs讓GDB作為一個子程序執行時,設定這個選項.它告訴GDB每當一個堆疊結構(棧幀)顯示出來(包括每次程式停止)就用標準的,認同的方式輸出檔案全名和行號.這裡,認同的格式看起來像兩個’ 32’字元,緊跟檔名,行號和字元位置(由冒號,換行符分隔).Emacs同GDB的介面程式使用這兩個’ 32’字元作為一個符號為框架來顯示原始碼
-b BAUDRATE設定行速(波特率或bits/s).在遠端除錯中GDB在任何序列介面中使用的行速
-tty=Device 使用Device作為你程式執行的標準輸入輸出

內部命令(除錯)

命令 描述
file [filename] 裝入想要除錯的可執行檔案
kill [filename] 終止正在除錯的程式
break [file:]function 在(file檔案的)function函式中設定一個斷點
clear 刪除一個斷點,這個命令需要指定程式碼行或者函式名作為引數
run [arglist] 執行您的程式 (如果指定了arglist,則將arglist作為引數執行程式)
bt Backtrace: 顯示程式堆疊資訊
print expr 打印表達式的值
continue 繼續執行您的程式 (在停止之後,比如在一個斷點之後)
list 列出產生執行檔案的原始碼的一部分
next 單步執行 (在停止之後); 跳過函式呼叫
nexti 執行下一行的原始碼中的一條彙編指令
set 設定變數的值。例如:set nval=54 將把54儲存到nval變數中
step 單步執行 (在停止之後); 進入函式呼叫
stepi 繼續執行程式下一行原始碼中的彙編指令。如果是函式呼叫,這個命令將進入函式的內部,單步執行函式中的彙編程式碼
watch 使你能監視一個變數的值而不管它何時被改變
rwatch 指定一個變數,如果這個變數被讀,則暫停程式執行,在偵錯程式中顯示資訊,並等待下一個除錯命令。參考rwatch和watch命令
awatch 指定一個變數,如果這個變數被讀或者被寫,則暫停程式執行,在偵錯程式中顯示資訊,並等待下一個除錯命令。參考rwatch和watch命令
Ctrl-C 在當前位置停止執行正在執行的程式,斷點在當前行
disable 禁止斷點功能,這個命令需要禁止的斷點在斷點列表索引值作為引數
display 在斷點的停止的地方,顯示指定的表示式的值。(顯示變數)
undisplay 刪除一個display設定的變數顯示。這個命令需要將display list中的索引做引數
enable 允許斷點功能,這個命令需要允許的斷點在斷點列表索引值作為引數
finish 繼續執行,直到當前函式返回
ignore 忽略某個斷點制定的次數。例:ignore 4 23 忽略斷點4的23次執行,在第24次的時候中斷
info [name] 檢視name資訊
load 動態載入一個可執行檔案到偵錯程式
xbreak 在當前函式的退出的點上設定一個斷點
whatis 顯示變數的值和型別
ptype 顯示變數的型別
return 強制從當前函式返回
txbreak 在當前函式的退出的點上設定一個臨時的斷點(只可使用一次)
make 使你能不退出 gdb 就可以重新產生可執行檔案
shell 使你能不離開 gdb 就執行 UNIX shell 命令
help [name] 顯示GDB命令的資訊,或者顯示如何使用GDB的總體資訊
quit 退出gdb

要得到所有使用GDB的資料,請參考Using GDB: A Guide to the GNU Source-Level Debugger, by Richard M. Stallman and Roland H. Pesch. 當用info檢視的時候,也能看到相同的文章

gdb的命令實在太多了,我們不可能全部列出來, 因此只列出了一部分,我們將在下一節”gdb幫助”中幫助在除錯的過程中通過help來檢視gdb的除錯命令

gdb幫助

我們知道gdb除錯的命令是非常多的, 我們不可能完全記住有些記住的用法也可能不太熟悉,那麼我們在使用的過程中,如果希望檢視某個命令的幫助資訊,可以使用gdb除錯幫助資訊

啟動gdb後,進入gdb的除錯環境中,就可以使用gdb的命令開始除錯程式了。

<code class="language-c hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">gdb</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

啟動gdb

gdb的命令可以使用help除錯命令來檢視,如下所示:

help

gdb help

注意我們此處所說的help除錯幫助命令與之前在終端中

gdb的命令很多,gdb將之分成許多種類。help命令只是列出gdb的命令種類

種類 描述
aliases Aliases of other commands
breakpoints Making program stop at certain points
data Examining data
files Specifying and examining files
internals Maintenance commands
obscure Obscure features
running Running the program
stack Examining the stack
status Status inquiries
support Support facilities
tracepoints Tracing of program execution without stopping the program
user-defined – User-defined commands

如果要看其中的命令,可以使用help 命令。 
如 help stack

gdb help stack

或者help breakpoints

gdb help breakpoints

也可以直接用help [command]來檢視命令的幫助。 
比如我們知道break可以插入一個斷點, 我們就檢視它的詳細資訊

<code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">help</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">break</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

gdb help break

gdb中,輸入命令時,可以不用輸入全部命令,只用輸入命令的前幾個字元就可以了。當然,命令的前幾個字元應該標誌著一個惟一的命令,在Linux下,可以按兩次TAB鍵來補齊命令的全稱,如果有重複的,那麼gdb會把它全部列出來。

gdb tabtab

要退出gdb時,只用輸入quit或其簡稱q就行了。

gdb使用

gdb中執行Linux的shell程式

在gdb環境中,可以執行Linux的shell命令

  1. shell <command string>  

gdb shell

呼叫Linux的shell來執行,環境變數SHELL中定義的Linux的shell將會用來執行。如果SHELL沒有定義,那就使用Linux的標準shell:/bin/sh(在Windows中使用Command.com或cmd.exe)

還有一個gdb命令是make:

<code class="language-c hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">make <make-args></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

可以在gdb中執行make命令來重新build自己的程式。這個命令等價於shell make

在gdb中執行程式

當以gdb 方式啟動gdb後,gdb會在PATH路徑和當前目錄中搜索的原始檔。如要確認gdb是否讀到原始檔,可使用l或list命令,看看gdb是否能列出原始碼。 
在gdb中,執行程式使用r或是run命令。程式的執行,有可能需要設定下面四方面的事。

程式執行引數

set args 可指定執行時引數。如:

<code class="language-c hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-built_in" style="color:#66066;box-sizing: border-box;">set</span> args <span class="hljs-number" style="color:#06666;box-sizing: border-box;">10</span> <span class="hljs-number" style="color:#06666;box-sizing: border-box;">20</span> <span class="hljs-number" style="color:#06666;box-sizing: border-box;">30</span> <span class="hljs-number" style="color:#06666;box-sizing: border-box;">40</span> <span class="hljs-number" style="color:#06666;box-sizing: border-box;">50</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

show args 命令可以檢視設定好的執行引數。

執行環境

引數 描述
path 可設定程式的執行路徑
show paths 檢視程式的執行路徑
set environment varname [=value] 設定環境變數。如:set env USER=hchen
show environment [varname] 檢視環境變數

工作目錄

引數 描述
cd 相當於shell的cd命令
pwd 顯示當前的所在目錄

程式的輸入輸出

引數 描述
info terminal 顯示程式用到的終端的模式
run > outfile 使用重定向控制程式輸出
tty /dev/ttyb tty命令可以指寫輸入輸出的終端裝置

除錯已執行的程式

除錯已經執行的程式有兩種方法:

  • 在Linux下用ps(第一章已經對ps作了介紹)檢視正在執行的程式的PID(程序ID),然後用gdb PID格式掛接正在執行的程式。

  • 先用gdb 關聯上原始碼,並進行gdb,在gdb中用attach命令來掛接程序的PID,並用detach來取消掛接的程序。

暫停/恢復程式執行

除錯程式中,暫停程式執行是必需的,gdb可以方便地暫停程式的執行。可以設定程式在哪行停住,在什麼條件下停住,在收到什麼訊號時停往等,以便於使用者檢視執行時的變數,以及執行時的流程。 
當程序被gdb停住時,可以使用info program 來檢視程式是否在執行、程序號、被暫停的原因。 
在gdb中,有以下幾種暫停方式:斷點(BreakPoint)、觀察點(WatchPoint)、捕捉點(CatchPoint)、訊號(Signals)及執行緒停止(Thread Stops)。 
如果要恢復程式執行,可以使用c或是continue命令。

設定斷點(BreakPoint)

用break命令來設定斷點。有下面幾種設定斷點的方法:

引數 描述
break 在進入指定函式時停住。C++中可以使用class::function或function(type,type)格式來指定函式名
break 在指定行號停住
break +offset和beak -offset 在當前行號的前面或後面的offset行停住。offiset為自然數
break filename:linenum 在原始檔filename的linenum行處停住
break filename:function 在原始檔filename的function函式的入口處停住
break *address 在程式執行的記憶體地址處停住
break 該命令沒有引數時,表示在下一條指令處停住
break … if condition表示條件,在條件成立時停住。比如在迴圈體中,可以設定break if i=100,表示當i為100時停住程式

檢視斷點時,可使用info命令,如下所示(注:n表示斷點號):

引數 描述
info breakpoints [n] 檢視斷點
info break [n] 檢視斷點

設定觀察點(WatchPoint)

觀察點一般用來觀察某個表示式(變數也是一種表示式)的值是否變化了。如果有變化,馬上停住程式。有下面的幾種方法來設定觀察點:

引數 描述
watch 為表示式(變數)expr設定一個觀察點。一旦表示式值有變化時,馬上停住程式
rwatch 當表示式(變數)expr被讀時,停住程式
awatch 當表示式(變數)的值被讀或被寫時,停住程式
info watchpoints 列出當前設定的所有觀察點

設定捕捉點(CatchPoint)

可設定捕捉點來補捉程式執行時的一些事件。如載入共享庫(動態連結庫)或是C++的異常。設定捕捉點的格式為:

引數 描述
catch 當event發生時,停住程式
tcatch 只設置一次捕捉點,當程式停住以後,應點被自動刪除

event可以是下面的內容

引數 描述
throw 一個C++丟擲的異常 (throw為關鍵字)
catch 一個C++捕捉到的異常 (catch為關鍵字)
exec 呼叫系統呼叫exec時(exec為關鍵字,目前此功能只在HP-UX下有用)
fork 呼叫系統呼叫fork時(fork為關鍵字,目前此功能只在HP-UX下有用)
vfork 呼叫系統呼叫vfork時(vfork為關鍵字,目前此功能只在HP-UX下有)
load 或 load 載入共享庫(動態連結庫)時 (load為關鍵字,目前此功能只在HP-UX下有用)
unload 或 unload 解除安裝共享庫(動態連結庫)時 (unload為關鍵字,目前此功能只在HP-UX下有用)

維護停止點

上面說了如何設定程式的停止點,gdb中的停止點也就是上述的三類。在gdb中,如果覺得已定義好的停止點沒有用了,可以使用delete、clear、disable、enable這幾個命令來進行維護

引數 描述
Clear 清除所有的已定義的停止點
clear 和clear 清除所有設定在函式上的停止點
clear 和clear 清除所有設定在指定行上的停止點
delete [breakpoints] [range…] 刪除指定的斷點,breakpoints為斷點號。如果不指定斷點號,則表示刪除所有的斷點。range 表示斷點號的範圍(如:3-7)。其簡寫命令為d,比刪除更好的一種方法是disable停止點。disable了的停止點,gdb不會刪除,當還需要時,enable即可,就好像回收站一樣
disable [breakpoints] [range…] disable所指定的停止點,breakpoints為停止點號。如果什麼都不指定,表示disable所有的停止點。簡寫命令是dis
enable [breakpoints] [range…] enable所指定的停止點,breakpoints為停止點號
enable [breakpoints] once range… enable所指定的停止點一次,當程式停止後,該停止點馬上被gdb自動disable
enable [breakpoints] delete range… enable所指定的停止點一次,當程式停止後,該停止點馬上被gdb自動刪除

停止條件維護

前面在介紹設定斷點時,提到過可以設定一個條件,當條件成立時,程式自動停止。這是一個非常強大的功能,這裡,專門介紹這個條件的相關維護命令。 
一般來說,為斷點設定一個條件,可使用if關鍵詞,後面跟其斷點條件。並且,條件設定好後,可以用condition命令來修改斷點的條件(只有break和watch命令支援if,catch目前暫不支援if)。

引數 描述
condition 修改斷點號為bnum的停止條件為expression
condition 清除斷點號為bnum的停止條件
ignore

相關推薦

Linux GDB除錯完全教程

本文將主要介紹linux下的強大除錯工具是怎麼完成這些工作的。 之所以要除錯程式,是因為程式的執行結果和預期結果不一致,或者程式出現執行時錯誤。  除錯的基本思想是:  分析現象 -> 假設錯誤原因 -> 產生新的現象去驗證假設 偵錯程式(如GDB)的

Linux gdb除錯程式

gdb 可執行檔案       進入gdb除錯環境,輸出介紹資訊         gdb -g 可執行檔案    進入除錯環境,可以不輸出介紹資訊      2、list命令 顯示除錯檔案程式碼(預設顯示10行,敲回車鍵繼續輸出10行...超出檔案總行數,會提示如:Line

Linux-gdb除錯

GDB是一個由GNU開源組織釋出的、UNIX/LINUX作業系統下的、基於命令列的、功能強大的程式除錯工具。他是學習指標、除錯程式非常有用的工具和方法 gdb的常見命令: 簡寫 全稱 備註

linux gdb 除錯多執行緒 多程序 顯示巨集

                一、gdb除錯多執行緒gdb)info thread 檢視當前程序的執行緒。 gdb)thread <ID> 切換除錯的執行緒為指定ID的執行緒。 gdb)break file.c:100 thread all  在file.c檔案第100行處為所有經過這裡的執行緒

linux gdb除錯

gdb除錯常用的命令: 1.顯示程式中的當前位置和表示如何到達當前位置的棧跟蹤:bt,  where,  info stack;這三個的功能都是一樣的,在程式崩潰之後使用該命令檢視堆疊的歷史記錄,很管用。 用法: bt n: 顯示程式棧頂的n幀資訊; bt -n:

arm-linux-gdb除錯工具的安裝與交叉編譯gdbserver

arm-linux-gdb除錯工具的安裝與交叉編譯gdbserver 分類:嵌入式 開發環境:LPC3250 開發板:安裝linux2.6.39; 交叉編譯工具:arm-none-linux-gnueabi-gcc pc的虛擬機器:Linux version 2.6.32.

linux gdb 除錯 coredump core 檔案,函式名稱是 問號

 google key: gdb問號 我的程式crash,有了coredump檔案,在Linux PC上用arm-linux-gdb debug it. The result is: #0  0x4022b178 in ?? () (gdb) bt #0 

Linux gdb除錯列印完整字串

在使用gdb除錯過程中,經常需要檢視變數的值,最常用的方法: (gdb) print {變數名} 一般情況下,列印並不存在問題。但當一個字串比較長時,打印出來的內容不完整,內容的最後為"..." 例如: 可以看到後面帶有省略號,內容沒有完整的顯示出來。 如何才能

Linux gdb除錯多執行緒

一、多執行緒除錯 多執行緒除錯可能是問得最多的。其實,重要就是下面幾個命令: info thread 檢視當前程序的執行緒。 thread <ID> 切換除錯的執行緒為指定ID的執行緒。 break file.c:100 thread all  在file.c檔案第100行處為所有經過這

linux GDB除錯時的臨時變數,臨時指標

今天除錯遇到了個很麻煩的事情,為了復現一個棧完全被踩成0x01010101010101010101的問題較勁了好幾天 期間需要多次call 函式來模擬程序裡的函式呼叫 但是坑爹的是,這個read_xxx(int, int, int*) 有個坑爹的指標 前2個入參好辦,直接傳

linux gdb 除錯工具

進入 gdb 除錯模式後 help 檢視支援的所有命令 info thread 列出所有的執行緒 thread apply all bt 檢視所有執行緒的呼叫堆疊 thread ID 切換到指定

linux使用gdb除錯程式完全教程

程式的除錯過程主要有:單步執行,跳入函式,跳出函式,設定斷點,設定觀察點,檢視變數。 本文將主要介紹linux下的強大除錯工具是怎麼完成這些工作的。 之所以要除錯程式,是因為程式的執行結果和預期結果不一致,或者程式出現執行時錯誤。 除錯的基本思想是: 分析現象 ->

使用gdb除錯程式完全教程

                     程式的除錯過程主要有:單步執行,跳入函式,跳出函式,設定斷點,設定觀察點,檢視變數。 本文將主要介紹linux下的強大除錯工具是怎麼完成這些工作的。之所以要除錯程式,是因為程式的執行結果和預期結果不一致,或者程式出現執行時錯誤。 除錯的基本思想是: 分析現象 ->

Linux程式設計——gdb除錯

    上一篇文章中,我們學習了gcc編譯器的使用。本文,我們就講解 gdb 偵錯程式(Debug)的使用,它可以幫助我們找出程式之中的錯誤和漏洞等等。     當程式編譯完成後,它可能無法正常執行;或許程式會徹底崩潰;或許只是不能

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

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

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

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

linuxgdb除錯檢視原始碼

 GDB是GNU開源組織釋出的一個強大的UNIX下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像VC、BCB等IDE的除錯,但如果你是在UNIX平臺下做軟體,你會發現GDB這個除錯工具有比VC、BCB的圖形化偵錯程式更強大的功能。所謂“寸有所長,尺有所短”就是這個道理。 &nb

Linux C/C++】 第07講 gdb除錯工具詳解

     當你需要單步跟蹤除錯的時候,就必然會用到gdb工具,不同於VS方便的除錯方式,gdb的除錯並不是那麼的方便直觀。不要降低熱情,熟練以後你會發現Linux下的程式設計方式非常好用。       一、簡介   &

linux下的GDB除錯 詳細

  vim min.c #輸入min.c的內容 gcc min.c -o min -g #必須寫-g gdb -q min #除錯可執行程式 -q是為了阻止顯示版本資訊 l # list 顯示原始碼 一次10行 l # list 顯示原始碼 接著10行 l # list 顯示原始

linux】Valgrind工具集詳解(六):使用Valgrind gdbserver和GDB除錯程式

一、概述 在Valgrind下執行的程式不是由CPU直接執行的。相反,它執行在Valgrind提供的合成CPU上。這就是偵錯程式在Valgrind上執行時無法除錯程式的原因。 二、快速入門 在使用Memcheck工具時使用GDB除錯程式,啟動方式如下: 1、valgrind