您好,登錄后才能下訂單哦!
這篇文章主要介紹“Linux程序調試工具gdb怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Linux程序調試工具gdb怎么使用”文章能幫助大家解決問題。
gdb是GNU開源組織發布的一個強大的Linux下的程序調試工具,主要來調試C/C++語言寫的程序,當然也就可以調試其他語言程序。
gdb-gnu調試器
gdb [-help] [-nx] [-q] [-batch] [-cd=dir] [-f] [-b bps] [-tty=dev] [-s symfile] [-e prog] [-se prog] [-c core] [-x cmds] [-d dir] [prog [core|procID]]
gdb [options] –args prog [arguments]
gdbtui [options]
gdb的目的主要是讓你知道程序內部正在運行什么代碼,或者是當程序崩潰的時候正在執行什么代碼
GDB主要可以做四種事情來幫助你找到bug:
啟動你的程序,指定任意可以影響程序行為的參數。
讓你的程序在指定的條件停住.
測試你的程序停止的時候發生了什么。
改變程序內部的變量,來改正程序的錯誤繼續執行。
你可以用gdb調試C/C++和modula-2程序,fortran的支持需要有Fortran編譯器
gdb使用shell命令gdb來調用,一旦開始,就從終端讀取命令直接gdb退出,你可以通過help命令獲取幫助信息。
可以不帶任何參數或選項執行gdb命令,但是最常用的啟動gdb的方式是帶一個或者兩個參數,指定一個可執行文件來作為參數:
gdb program(gdb+可執行文件名稱)
也可以再gdb文件后面指定可執行文件 和 core文件的名稱:
gdb program core(gdb + 可執行文件 +core文件)
You can, instead, specify a process ID as a second argument, if you want to debug a running process:
也可以指定一個進程id作為第二個參數,如果你想調試一個正在運行的程序:
gdb program 1234(gdb進程名+進程id)
會附件gdb到進程1234上(除非有一個文件名“1234”;GDB首先檢查core文件)
break [file:]function
設置一個斷點在函數中(在文件中)
run [arglist]
啟動程序帶上指定的參數
bt Backtrace:
顯示堆棧
print expr
顯示表達式的值
c
繼續執行你的程序(程序停住后,例如:在斷點處停止)
next
執行程序的下一行代碼(程序停止以后);跨國任何當前行的函數調用。
edit [file:]function
查看當前程序停在哪。
list [file:]function
顯示程序當前停住的代碼行附近的代碼
step 單步調試
執行程序的下一行(程序停住后),進入當前行的函數調用的內部
help [name]
顯示gdb命令的相關信息。
quit
退出gdb
需要詳細的gdb說明,查看using gdb:一個gdb調試程序的指南,stallmain和roland寫的,也有可用的在線文檔作為gdb入口在gdb項目信息中。
默認的情況下,第一個選項就是執行文件名(等同與”-se”),第二個選項就是core文件名(等同與”-c”),許多選項都有全稱和簡寫,如下:
全稱格式也是工人的,如果你截斷他們,只要足夠明確也可以使用。(如果你愿意的話,你可以“+”而不是“-”來標記選項,盡管“-”是更常用的)。
所有的選項和命令行參數都是按順序處理的,當使用-x選項的時候這個選項會不同。
-b bps
設置gdb遠程調試的所有串行接口的速度
-batch
批處理執行模式,處理完“-x”(和”.gdbinit”,如果不inhibited)指定的所有命令文件以返回碼0退出,如果出錯則返回非0,當把gdb作為過濾器的時候,批處理模式非常有用,來在遠程電腦上測試下載和執行程序,為了確定它有用,程序退出的消息(當一個程序在gdb模式下發布到控制終端的消息)不發布當使用批處理模式的時候.
-c FILE, -core=FILE
使用文件作為一個coredump文件來測試
-cd=directory
指定工作目錄,不指定則為當前目錄
-d DIRECTORY, -directory=DIRECTORY
Add directory to the path to search for source files.
-e FILE, -exec=FILE
指定可執行文件的名稱
-f, -fullname
emacs設置這些選項當把gdb作為一個子進程的時候,告訴gdb在每次堆棧顯示時候以標準且可識別的方式輸出完整的文件名和行號(包含每次程序中斷的時候),可識別的形式看上去像兩個’32’字符開始,接下來是文件名,行號和字符位置和新行,他們用冒號分割,emacs-to-gdb接口程序用兩個‘32’字符作為信號來在一幀上顯示源代碼。
-h, -help
顯示幫助信息
-n, -nx
不要從任何”.gdbinit”結尾的初始化文件執行,正常情況下,這種文件的命令在所有的命令行參數和選項處理完成之后才執行。
-s FILE, -symbols=FILE
從文件中讀取符號表
-se=file
讀取符號表的文件和可執行文件
q, -quiet
退出,不打印介紹信息和版權信息,這些消息在批處理模式下也不打印
-tty=device
使用設備來作為你的標準輸入和輸出
–args
在你的程序名后面傳遞參數當程序執行的時候。
-tui
運行gdb使用文檔(控制臺)用戶接口。
-write
允許寫入執行文件和core文件
-x FILE, -command=FILE
從文件中執行gdb命令
文件名:add.c
代碼很簡單,實現一個加法,兩個數相加,輸出結果
#include
int add(int x,int y)
{
return x+y;
}
int main()
{
int x = 10;
int y = 20;
int num = add(x,y);
printf(” num = %d\n”,num);
return 0;
}
編譯gcc -g add.c生成a.out文件(注意編譯的時候一定要加上-g選項才能使用gdb調試程序)
gdb ./a.out
上圖中有一個警告信息,因為我是源代碼安裝的,拷貝gdb下的python庫到指定的目錄即可(警告中的目錄)
輸入help可以查看幫助信息
start啟動程序
可以使用n,s命令跑完整個程序,很簡單,可以通過這個簡單的demo熟悉一下gdb的各種命令。
gdb調試多進程的命令:
set follow-fork-mode mode設置調試器的模式
mode參數可以是
parent fork之后調試原進程,子進程不受影響,這是缺省的方式
child fork之后調試新的進程,父進程不受影響。
show follow-fork-mode 顯示當前調試器的模式
set detach-on-fork mode 設置gdb在fork之后是否detach進程中的其中一個,或者繼續保留控制這兩個進程
on 子進程(或者父進程,依賴于follow-fork-mode的值)會detach然后獨立運行,這是缺省的mode
off 兩個進程都受gdb控制,一個進程(子進程或父進程,依賴于follow-fork-mode)被調試,另外一個進程被掛起
info inferiors 顯示所有進程
inferiors processid 切換進程
detach inferiors processid detach 一個由指定的進程,然后從fork 列表里刪除。這個進程會被
允許繼續獨立運行。
kill inferiors processid 殺死一個由指定的進程,然后從fork 列表里刪除。
catch fork 讓程序在fork,vfork或者exec調用的時候中斷
實例:fork.c
#include
#include
#include
#include
int add(int x,int y)
{
return x+y;
}
int test()
{
int num = 0;
pid_t pid = fork();
if(pid == 0)
{
while(1)
{
num = add(1,2);
printf(“child:pid:%d num = %d\n”,getpid(),num);
sleep(1);
}
exit(0);
}
while(1){
num = add(10,20);
printf(“parent:pid:%d num = %d\n”,getpid(),num);
sleep(1);
}
return 0;
}
int main()
{
test();
return 0;
}
編譯 gcc -g fork.c
設置catch fork,查看 follow-fork-mode和detach-on-fork的默認值
設置detach-on-fork為off,start啟動程序,會再fork斷點處停止
再兩個進程中的add函數分別設置端點:
繼續執行程序,info inferiors顯示進程
inferiors 2切換進程
detach inferiors 2
重新啟動gdb來測試kill inferiors 2,如下圖
gdb調試多線程的命令:
info threads 查詢線程信息
thread threadno 切換線程
thread apply [threadno] [all] args 對線程列表執行命令
set print thread-events 控制線程開始和結束時的打印信息
show print thread-events 顯示線程打印信息的開關狀態
實例:文件名thread.c
代碼很簡單如下:
#include
#include
#include
int add(int x,int y)
{
return x+y;
}
void* thread(void *args)
{
int num = 0;
while(1)
{
num += add(1,2);
sleep(1);
}
}
int main()
{
pthread_t tid;
pthread_create(&tid, NULL, thread, NULL);
int num = 0;
while(1)
{
num += add(10,20);
sleep(1);
}
return 0;
}
編譯gcc -g thread.c -lpthread(鏈接pthread線程庫)
gdb調試:gdb ./a.out
在線程中兩個調用add函數的位置分別設置斷點
start啟動程序,c繼續執行程序直到斷點處
info threads顯示當前程序中的線程
c繼續執行程序,到達第二個程序再執行info threads命令,發現當前程序發生了線程切換,由線程2變為線程1
thread 2手動切換線程到線程2,再執行info threads查看當前線程
使用thread apply 命令的示例:
set print thread-events on/off 這里默認是開啟的
show print thread-events
關于“Linux程序調試工具gdb怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。