Bootstrap: 模態框元件
阿新 • • 發佈:2021-09-10
目錄
Linux gdb除錯
一丶GDB
1.1 簡介
GDB是一個在UNIX(LINUX)環境下的命令列除錯工具。如果除錯C/C++程式可以在gcc/g++
編譯生成的時候加上-g選項。
二丶命令介紹
2.1 GDB除錯程式
2.1.1 GDB除錯
GDB除錯一個程式有多種方法
首先可以使用命令生成除錯檔案。然後看下錶所示來進行除錯。
命令:
gcc -m32 -g main.cpp -o main.out
GDB命令表
命令 | 說明 |
---|---|
gdb |
指定你要除錯的程式的檔名直接開始除錯 |
gdb |
用gdb同時除錯一個執行程式和一個core檔案。core檔案就是程式非法執行後的coredump後產生的檔案。記錄了程式在出錯的時候的一些記憶體環境和出錯資訊。 可以理解為windows平臺上的dump檔案 |
gdb |
如果你的程式是一個服務程式,那麼可以制定這個服務程式執行時的程序id. gdb則會自動attach上去,並且除錯他。 program應能在環境變數PATH中搜索得到。 |
2.1.2 GDB啟動時候的引數
gdb命令在啟動的時候可以附加一些引數,這些引數也稱為GDB的啟動開關。
如果想看詳細的開關可以用gdb-help檢視。
下面列舉一下常見的引數
引數 | 作用 |
---|---|
-symbols |
一個是全名稱,一個是縮寫。 代表的意思是從指定檔案中讀取符號表. |
-se file | 從指定檔案中讀取符號表資訊,並把它用在可執行檔案中。 |
-core |
除錯core dump的core檔案 |
-directory |
加入一個原始檔的搜尋路徑。預設搜尋路徑是PATH環境中所能搜尋到的路徑。 |
提示:
GDB支援全名和縮寫。所以在使用的時候任選其一即可。
2.1.3 GDB的基本命令
直接做成表
命令 | 作用 |
---|---|
l | 不是一 也不是 ai(i) 是L ,作用是檢視原始碼,原始碼會進行行號提示。如果要檢視的函式是其他檔案中定義的函式,那麼在l後面加上函式名即可定位到這個函式的定義,以及檢視附近的其他原始碼,或者使用斷點 或者單步執行,到了某個函式處使用s進入這個函式也可以。 |
b | b指令設定斷點: b 6 在原始碼的第六行下斷點。 這個行號是gdb的行號 |
info b | info b 可以檢視斷點列表。 |
r | 執行程式碼 |
p | p是列印變數名,但是你需要在程式暫停的時候使用。例如有個n變數。 可以 p n 來檢視n的值。 GDB在顯示變數值的時候都會在對應值前面加上$N標記,它是當前變數值的引用標記,當你想再次使用的時候可以直接寫作 “$N”,而無需寫冗長的變數名。 |
watch | watch檢視某一個變數的變化情況,一般用於迴圈的時候使用。 watch n |
n | 單步執行 |
c | 程式繼續執行,直到遇到斷點或者程式結束。 |
q | 退出gdb |
2.1.4 GDB中的斷點除錯
命令格式 | 例子 | 作用 |
---|---|---|
break + 設定斷點的行號 | break n | 在n行處設定斷點 |
tbreak + 行號或函式名 | tbreak n/func | 設定臨時斷點,到達後被自動刪除 |
break + filename + 行號 | break main.c:10 | 用於在指定檔案對應行設定斷點 |
break + <0x...> | break 0x3400a | 用於在記憶體某一位置處暫停 |
break + 行號 + if + 條件 | break 10 if i==3 | 用於設定條件斷點,在迴圈中使用非常方便 |
info breakpoints/watchpoints [n] | info break | n表示斷點號,檢視斷點/觀察點的情況 |
clear + 要清除的斷點行號 | clear 10 | 用於清除對應行的斷點,要給出斷點的行號,清除時GDB會給出提示 |
delete + 要清除的斷點編號 | delete 3 | 用於清除斷點和自動顯示的表示式的命令,要給出斷點的編號,清除時GDB不會給出任何提示 |
disable/enable + 斷點編號 | disable 3 | 讓所設斷點暫時失效/使能,如果要讓多個編號處的斷點失效/使能,可將編號之間用空格隔開 |
awatch/watch + 變數 | awatch/watch i | 設定一個觀察點,當變數被讀出或寫入時程式被暫停 |
rwatch + 變數 | rwatch i | 設定一個觀察點,當變數被讀出時,程式被暫停 |
catch | 設定捕捉點來補捉程式執行時的一些事件。如:載入共享庫(動態連結庫)或是C++的異常 | |
tcatch | 只設置一次捕捉點,當程式停住以後,應點被自動刪除 |
2.1.5 資料操作命令
命令格式 | 例子 | 作用 |
---|---|---|
display +表示式 | display a | 用於顯示錶達式的值,每當程式執行到斷點處都會顯示錶達式的值 |
info display | 用於顯示當前所有要顯示值的表示式的情況 | |
delete + display 編號 | delete 3 | 用於刪除一個要顯示值的表示式,被刪除的表示式將不被顯示 |
disable/enable + display 編號 | disable/enable 3 | 使一個要顯示值的表示式暫時失效/使能 |
undisplay + display 編號 | undisplay 3 | 用於結束某個表示式值的顯示 |
whatis + 變數 | whatis i | 顯示某個表示式的資料型別 |
print(p) + 變數/表示式 | p n | 用於列印變數或表示式的值 |
set + 變數 = 變數值 | set i = 3 | 改變程式中某個變數的值 |
補充:
在使用print命令時,可以對變數按指定格式進行輸出,其命令格式為print /變數名 + 格式
其中常用的變數格式:x:十六進位制;d:十進位制;u:無符號數;o:八進位制;c:字元格式;f:浮點數。
2.1.6 除錯執行環境相關命令
命令格式 | 例子 | 作用 |
---|---|---|
set args | set args arg1 arg2 | 設定執行引數 |
show args | show args | 檢視執行引數 |
set width + 數目 | set width 70 | 設定GDB的行寬 |
cd + 工作目錄 | cd ../ | 切換工作目錄 |
run | r/run | 程式開始執行 |
step(s) | s | 進入式(會進入到所呼叫的子函式中)單步執行,進入函式的前提是,此函式被編譯有debug資訊 |
next(n) | n | 非進入式(不會進入到所呼叫的子函式中)單步執行 |
finish | finish | 一直執行到函式返回並列印函式返回時的堆疊地址和返回值及引數值等資訊 |
until + 行數 | u 3 | 執行到函式某一行 |
continue(c) | c | 執行到下一個斷點或程式結束 |
return <返回值> | return 5 | 改變程式流程,直接結束當前函式,並將指定值返回 |
call + 函式 | call func | 在當前位置執行所要執行的函式 |
2.1.7 堆疊相關命令
更多操作命令格式 | 例子 | 作用 |
---|---|---|
backtrace/bt | bt | 用來列印棧幀指標,也可以在該命令後加上要列印的棧幀指標的個數,檢視程式執行到此時,是經過哪些函式呼叫的程式,程式“呼叫堆疊”是當前函式之前的所有已呼叫函式的列表(包括當前函式)。每個函式及其變數都被分配了一個“幀”,最近呼叫的函式在 0 號幀中(“底部”幀) |
frame | frame 1 | 用於列印指定棧幀 |
info reg | info reg | 檢視暫存器使用情況 |
info stack | info stack | 檢視堆疊使用情況 |
up/down | up/down | 跳到上一層/下一層函式 |
2.1.8 跳轉執行指令
跳轉執行指令就一個jump 此指令可以指定下一條語句的執行點。也可以是檔案的行號。
也可以是 file:line 格式。 也可以是+offset偏移的格式。 如果在ARM彙編中其實就是修改了PC暫存器的指向值。 如果在INTER X86平臺中就是修改了IP的指向(EIP/RIP)