斷點
在代碼的指定位置中斷,使程序在此中斷。
-
break <function> 在進入指定函數時停住
-
break <linenum> 在指定行號停住。
-
break +/-offset 在當前行號的前面或后面的offset行停住。offiset為自然數。
-
break filename:linenum 在源文件filename的linenum行處停住。
-
break ... if <condition> ...可以是上述的參數,condition表示條件,在條件成立時停住。比如在循環境體中,可以設置break if i=100,表示當i為100時停住程序。
案例:
(gdb) break sc_smartcontract_handler.cpp:45 Breakpoint 4 at 0x424d42: file sc_smartcontract_handler.cpp, line 45.
對斷點的相關操作
-
delete 刪除所有斷點
-
delete breakpoint [n] 刪除某個斷點
-
disable breakpoint [n] 禁用某個斷點
-
enable breakpoint [n] 使能某個斷點
- info breakpoints [n] 查看當前斷點信息
觀察點
捕捉點用來補捉程序運行時的一些事件。如:載入共享庫(動態鏈接庫)、C++的異常等。通常也是用來定位bug。
捕捉點的命令格式是:catch <event>,event可以是下面的內容
-
watch <expr> 變量發生變化時中斷
-
rwatch <expr> 變量被讀時中斷
-
awatch <expr> 變量值被讀或被寫時中斷
可以通過info watchpoints [n]命令查看當前觀察點信息
查看變量
最常用的查看變量的方法是
(gdb) print {變量名}
(gdb) print argc $1 = 1
如果打印數組,由於默認的設置,可能打印的數組尾部部分沒有顯示,可以通過如下的命令設置打印數組的最大長度
(gdb) set print elements 300
調試中查看代碼
- list function 如list main:顯示main函數附近的代碼
- list file:function 如list main.c:main:顯示main.c中的main函數附近的代碼
- list n1,n2 如list 10,20,顯示當前文件的10到20行
雖然list已經很方便了, 但還是不盡人意. 如果能夠在運行的同時顯示代碼就好了, 答案是肯定的.
使用如下命令啟動gdb: gdb -tui 項目名 或者在啟動gdb后, 輸入命令focus,如圖:

恢復程序運行和單步調試
在gdb中,和調試步進相關的命令主要有如下幾條:
-
continue 繼續運行程序直到下一個斷點(類似於VS里的F5)
-
next 逐過程步進,不會進入子函數(類似VS里的F10)
-
step 逐語句步進,會進入子函數(類似VS里的F11)
-
until 運行至當前語句塊結束
-
finish 運行至函數結束並跳出,並打印函數的返回值(類似VS的Shift+F11)
GDB backtrace bt 查看程序crash堆棧信息
當程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。當你的程序調用了一個函數,函數的地址,函數參數,函數內的局部變量都會被壓入“棧”(Stack)中。你可以用bt命令來查看當前的棧中的信息。
在特定線程中中斷
你可以定義你的斷點是否在所有的線程上,或是在某個特定的線程。GDB很容易幫你完成這一工作。
- break <linespec> thread <threadno>
- break <linespec> thread <threadno> if ...
linespec指定了斷點設置在的源程序的行號。threadno指定了線程的ID,注意,這個ID是GDB分配的,你可以通過"info threads"命令來查看正在運行程序中的線程信息。如果你不指定thread <threadno>則表示你的斷點設在所有線程上面。你還可以為某線程指定斷點條件。如:
(gdb) break frik.c:13 thread 28 if bartab > lim
當你的程序被GDB停住時,所有的運行線程都會被停住。這方便你你查看運行程序的總體情況。而在你恢復程序運行時,所有的線程也會被恢復運行。那怕是主進程在被單步調試時。
其他
查看當前程序棧的內容: x/10x $sp-->打印stack的前10個元素
查看當前程序棧的信息: info frame----list general info about the frame
查看當前程序棧的參數: info args---lists arguments to the function
查看當前程序棧的局部變量: info locals---list variables stored in the frame
查看當前寄存器的值:info registers(不包括浮點寄存器) info all-registers(包括浮點寄存器)
查看當前棧幀中的異常處理器:info catch(exception handlers)
參考博客
