1. 在CMakeLists.txt文件中添加如下語句:
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
2. 編譯
cmake Path // path 是CMakeLists.txt 所在路徑
編譯后得到make文件
make -j2 //2個(gè)core編譯
3. 使用gdb運(yùn)行可執(zhí)行程序
gdb ./xxx.out
4. 正常的話進(jìn)入了gdb console
配置運(yùn)行參數(shù):
set args xxx
eg: set args -c /path1/path2監(jiān)控子線程:
set follow-fork-mode child和set auto-load safe-path /set detach-on-fork off
5. 設(shè)置斷點(diǎn)
b hello.c:15 // 給hello.c的15 行上斷點(diǎn)
多個(gè)源文件時(shí)指定breakpoint的位置:
如果有多層目錄,則在gdb中,用dir命令把你所想加入的文件的目錄指定出來,然后b 命令就可以用了。
就是類似這樣的:
dir ../app(相對路徑,絕對路徑都行)
6.運(yùn)行
r //就是run
- n是next,s是step
- p是print 查看某個(gè)變量x ---->
p x - gdb看變量是哪個(gè)數(shù)據(jù)類型 (gdb) whatis i
gdb打印表達(dá)式的值:print/f 表達(dá)式
f是輸出的格式,x/d/u/o/t/a/c/f
表達(dá)式可以是當(dāng)前程序的const常量,變量,函數(shù)等內(nèi)容,但是GDB不能使用程序中所定義的宏
查看當(dāng)前程序棧的內(nèi)容: x/10x $sp-->打印stack的前10個(gè)元素
查看當(dāng)前程序棧的信息: info frame----list general info about the frame
查看當(dāng)前程序棧的參數(shù): info args---lists arguments to the function
查看當(dāng)前程序棧的局部變量: info locals---list variables stored in the frame
查看當(dāng)前寄存器的值:info registers(不包括浮點(diǎn)寄存器) info all-registers(包括浮點(diǎn)寄存器)
查看當(dāng)前棧幀中的異常處理器:info catch(exception handlers)
d 按十進(jìn)制格式顯示變量 x 按十六進(jìn)制格式顯示變量 a 按十六進(jìn)制格式顯示變量 u 按十六進(jìn)制格式顯示無符號(hào)整型 o 按八進(jìn)制格式顯示變量 t 按二進(jìn)制格式顯示變量 c 按字符格式顯示變量 f 按浮點(diǎn)數(shù)格式顯示變量
Cannot insert breakpoint 1.
刪除所有斷點(diǎn)delete
轉(zhuǎn)自http://blog.chinaunix.net/uid-20760757-id-1872358.html
主要內(nèi)容是介紹一些在程序調(diào)試過程中最常用的GDB命令,廢話不多話,開始今天的正題。
1.attach process-id/detach
(1)attach process-id: 在GDB狀態(tài)下,開始調(diào)試一個(gè)正在運(yùn)行的進(jìn)程,其進(jìn)程ID為process-id
(2)detach: 停止調(diào)試當(dāng)前正在調(diào)試有進(jìn)程,與attach配對試用
2.kill
(1)基本功能:殺掉當(dāng)前GDB正在調(diào)試的應(yīng)用程序所對應(yīng)的子進(jìn)程
(2)如果想不退出GDB而對當(dāng)前正在調(diào)試的應(yīng)用程序重新編譯、鏈接,可以在GDB中執(zhí)行kill殺掉子進(jìn)程,等編譯、鏈接完后,再重新執(zhí)行run,GDB便可加載新的可執(zhí)行程序啟動(dòng)調(diào)試
3.多線程程序調(diào)試相關(guān):
(1)thread threadno:切換當(dāng)前線程到由threadno指定的線程
(2)info threads:查看GDB當(dāng)前調(diào)試的程序的各個(gè)線程的相關(guān)信息
(3)thread apply [threadno] [all] args:對指定(或所有)的線程執(zhí)行由args指定的命令
4.多進(jìn)程程序調(diào)試相關(guān)(fork/vfork):
(1)缺省方式:fork/vfork之后,GDB仍然調(diào)試父進(jìn)程,與子進(jìn)程不相關(guān)
(2)set follow-fork-mode mode:設(shè)置GDB行為,mode為parent時(shí),與缺省情況一樣;mode為child時(shí),fork/vfork之后,GDB進(jìn)入子進(jìn)程調(diào)試,與父進(jìn)程不再相關(guān)
(3)show follow-fork-mode:查看當(dāng)前GDB多進(jìn)程跟蹤模式的設(shè)置
5.step & stepi
(1)step [count]: 如果沒有指定count, 則繼續(xù)執(zhí)行程序,直到到達(dá)與當(dāng)前源文件不同的源文件中時(shí)停止;如果指定了count, 則重復(fù)行上面的過程count次
(2)stepi [count]: 如果沒有指定count, 繼續(xù)執(zhí)行下一條機(jī)器指令,然后停止;如果指定了count,則重復(fù)上面的過程count次
(3)step比較常見的應(yīng)用場景:在函數(shù)func被調(diào)用的某行代碼處設(shè)置斷點(diǎn),等程序在斷點(diǎn)處停下來后,可以用step命令進(jìn)入該函數(shù)的實(shí)現(xiàn)中,但前提是該函數(shù)編譯的時(shí)候把調(diào)試信息也編譯進(jìn)去了,負(fù)責(zé)step會(huì)跳過該函數(shù)。
6.next & nexti
(1)next [count]: 如果沒有指定count, 單步執(zhí)行下一行程序;如果指定了count,單步執(zhí)行接下來的count行程序
(2)nexti [count]: 如果沒有指定count, 單步執(zhí)行下一條指令;如果指定了count, 音頻執(zhí)行接下來的count條執(zhí)行
(3)stepi和nexti的區(qū)別:nexti在執(zhí)行某機(jī)器指令時(shí),如果該指令是函數(shù)調(diào)用,那么程序執(zhí)行直到該函數(shù)調(diào)用結(jié)束時(shí)才停止。
7.continue [ignore-count]
喚醒程序,繼續(xù)運(yùn)行,至到遇到下一個(gè)斷點(diǎn),或者程序結(jié)束。如果指定ignore-count,那么程序在接下來的運(yùn)行中,忽略ignore-count次斷點(diǎn)。
8. finish & return
(1)finish: 繼續(xù)執(zhí)行程序,直到當(dāng)前被調(diào)用的函數(shù)結(jié)束,如果該函數(shù)有返回值,把返回值也打印到控制臺(tái)
(2)return [expression]: 中止當(dāng)前函數(shù)的調(diào)用,如果指定了expression,把expresson值當(dāng)做當(dāng)前函數(shù)的返回值;如果沒有,直接結(jié)束當(dāng)前函數(shù)調(diào)用
9.信號(hào)的處理
(1)info signals & info handle:打印所有的信號(hào)相關(guān)的信息,以及GDB缺省的處理方式:
(2)handle signal action: 設(shè)置GDB對具體某個(gè)信號(hào)的處理方式。signal可以為信號(hào)整數(shù)值,也可以為SIGSEGV這樣的符號(hào)。action的取值有:
a. stop和nostop: nostop表示當(dāng)GDB收到指定的信號(hào),不會(huì)應(yīng)用停止程序的執(zhí)行,只會(huì)打印出一條收到信號(hào)的消息,因此,nostop也暗含了下面的print; 而stop則表示,當(dāng)GDB收到指定的信號(hào),停止應(yīng)用程序的執(zhí)行。
b. print和noprint: print表示如果收到指定的信號(hào),打印出一條信息; noprint與print表示相反的意思
c. pass和nopass:pass表示如果收到指定的信號(hào),把該信號(hào)通知給應(yīng)用程序; nopass表示與pass相反的意思
d. ignore和noignore: ignore與nopass同義,同理,noignore與pass同義