gdb除錯帶引數程式

2021-07-23 10:04:57 字數 1875 閱讀 7375

一、問題

如果執行 $gdb ./a.out 1 2 3 肯定會報錯。正確的做法是:

$gdb --args ./a v1 v2 v3

$gdb ./a,進入gdb後  r v1 v2 v3

$gdb ./a,進入gdb後  設定引數set args v1 v2 v3 再直接 r。

通過這三種方法,你就可以除錯帶引數的程式。

二、例子

一般來說gdb主要除錯的是c/c++的程式。要除錯c/c++的程式,首先在編譯時,我們必須要把除錯資訊加到可執行檔案中。使用編譯器(cc/gcc/g++)的 -g 引數可以做到這一點。如: 

> cc -g hello.c -o hello 

> g++ -g hello.cpp -o hello 

如果沒有-g,你將看不見程式的函式名、變數名,所代替的全是執行時的記憶體位址。當你用-g把除錯資訊加入之後,並成功編譯目標**以後,讓我們來看看如何用gdb來除錯他。 

啟動 gdb的方法有以下幾種: 

1、gdb

program也就是你的執行檔案,一般在當然目錄下。 

2、gdb core 

用gdb同時除錯乙個執行程式和core檔案,core是程式非法執行後core dump後產生的檔案。 

3、gdb

如果你的程式是乙個服務程式,那麼你可以指定這個服務程式執行時的程序id。gdb會自動attach上去,並除錯他。program應該在 path環境變數中搜尋得到。 gdb啟動時,可以加上一些gdb的啟動開關,詳細的開關可以用gdb -help檢視。我在下面只例舉一些比較常用的引數: 

-symbols

-s 從指定檔案中讀取符號表。 

-se file 

從指定檔案中讀取符號表資訊,並把他用在可執行檔案中。 

-core

-c 除錯時core dump的core檔案。 

-directory

-d 加入乙個原始檔的搜尋路徑。預設搜尋路徑是環境變數中path所定義的路徑。

當以gdb 方式啟動gdb後,gdb會在path路徑和當前目錄中搜尋的原始檔。如要確認gdb是否讀到原始檔,可使用l或list命令,看看gdb是否能列出源**。 

在gdb中,執行程式使用r或是run命令。 程式的執行,你有可能需要設定下面四方面的事。 

1、程式執行引數。 

set args 可指定執行時引數。(如:set args 10 20 30 40 50) 

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

2、 執行環境。 

path 可設定程式的執行路徑。 

show paths 檢視程式的執行路徑。 

set environment varname [=value] 設定環境變數。如:set env user=hchen 

show environment [varname] 檢視環境變數。 

3、工作目錄。 

cd 相當於shell的cd命令。 

pwd 顯示當前的所在目錄。 

4、程式的輸入輸出。 

info terminal 顯示你程式用到的終端的模式。 

run > outfile 使用重定向控制程式輸出。 

tty /dev/ttyb tty命令可以指寫輸入輸出的終端裝置。

具體來說就是

例如乙個程式名為prog 引數為 -l a -c abc 則,執行gcc/g++ -g  prog.c/cpp -o prog,就可以用gdb除錯程式prog

#gdb prog

進入gdb除錯介面,輸入引數命令set args 後面加上程式所要用的引數,注意,不再帶有程式名,直接加引數,如:set args -l a -c abc

回車後輸入:r

參考:  

您可能也喜歡:

gdb除錯帶引數程式

來自 方法一 gdb args program arg1 arg2 arg3 方法二 gdb program gdb break xx 下個斷點 gdb r arg1 arg2 arg3 方法三 gdb program gdb break xx 下個斷點 gdb set args arg1 arg2...

gdb除錯帶引數程式

一般來說gdb主要除錯的是c c 的程式。要除錯c c 的程式,首先在編譯時,我們必須要 把除錯資訊加到可執行檔案中。使用編譯 器 cc gcc g 的 g 引數可以做到這一點。如 cc g hello.c o hello g g hello.cpp o hello 如果沒有 g,你將看不見程式的函...

gdb除錯帶引數程式

一般來說gdb主要除錯的是c c 的程式。要除錯c c 的程式,首先在編譯時,我們必須要 把除錯資訊加到可執行檔案中。使用編譯 器 cc gcc g 的 g 引數可以做到這一點。如 cc g hello.c o hello g g hello.cpp o hello 如果沒有 g,你將看不見程式的函...