基礎教學:
https://www.cnblogs.com/chenmingjun/p/8280889.html
大型工程:(針對調試CMakeLists.txt文件)
可打開gdb圖形界面調試:
gdb a.out --tui
調試CMakeLists.txt文件前提是在CMakeLists.txt文件中要添加下面這一行:
#dubug 模式------------------這個非常重要,否則無法進入斷點
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
GDB常用指令
一、基本指令
編程設置:1.需要加-g,不能有-s,如g++ -g main.cpp
常用指令
(gdb)gdb e(或者輸入gdb) (gdb)file e //進入gdb,執行e文件
(gdb)info breakpoints //可使用info查看斷點相關的信息
(gdb)break 7 //以行號設置斷點
(gdb)break function_name //以函數名設置斷點
(gdb)clear 行號 //刪除這行的斷點
(gdb)clear 函數名 //刪除該函數的斷點
(gdb)delete breakpoints n //刪除第n次(指定編號)設置的斷點
(gdb)clear //刪除程序中所有的基於行設置的斷點
(gdb)delete //刪除程序中所有的斷點
(gdb)r //執行程序
(gdb)n //單步調試
(gdb)s //進入函數內部調試
(gdb)c //執行到下一個斷點
(gdb)print 變量或表達式 //打印變量或表達式當前的值。
(gdb)print 變量=值 //對變量進行賦值
(gdb)whatis 變量或表達式 //顯示變量類型
(gdb)set variable 變量=值 //變量賦值
二、斷點管理
1.以行號設置斷點
(gdb)break 7
(gdb)run
2.以函數名設置斷點
(gdb)break function_name
(gdb)run
3.以條件表達式設置斷點
(gdb)break 7 if i99
(gdb)run
4.另一種,以表達式設置斷點的方法
(gdb)watch i99
這個命令必須在變量i被定義之後纔會成功運行,爲了解決這個問題,首先在變量 i 被定義的後一行設置中斷,然後使用run命令運行程序,程序暫停後就可以使用watch i==99設置斷點了。
##############################
單步執行
(gdb)next
#############################
查看當前設置的斷點信息
(gdb)info breakpoints
###############################
使中斷失效(斷點仍然存在)或有效
(gdb)info breakpoints
(gdb)disable b_id //使中斷失效,b_id 爲中斷編號
(gdb)info breakpoints
(gdb)enable b_id //使中斷有效,b_id 爲中斷編號
(gdb)info breakpoints
##############################
刪除斷點
clear : 刪除程序中所有的斷點
clear 行號 : 刪除這行的斷點
clear 函數名 : 刪除該函數的斷點
delete b_id1 b_id2 … : 刪除指定編號的斷點
##################################
查看和設置變量值
1.print命令
print 變量或表達式:打印變量或表達式當前的值。
print 變量=值:對變量進行賦值。
print 表達式@要打印的值的個數n:打印以表達式開始的n個數
2.whatis命令:顯示某個變量或表達式值的數據類型
whatis 變量或表達式
例子:
3.set命令:給變量賦值
set variable 變量=值
【提示】set命令還可以針對遠程調試進行設置,可以用來設置gdb一行的字符數等。
4.多線程
查看線程的一些信息
1.查看進程:info inferiors
2.查看線程:info threads
3.查看線程棧結構:bt
4.切換線程:thread n(n代表第幾個線程)
5.只運行當前進程:set scheduler-locking on
6.所有線程並行:set scheduler-locking off
7.切換線程 :thread ID(1,2,3…)
8.thread apply all command :讓所有線程執行命令command(比如thread apply all bt)
gdb介紹:(下面這條鏈接介紹GDB也很詳細)