cmake 多進(jìn)程debug

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 childset 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同義

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 又來到了一個(gè)老生常談的問題,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個(gè)問題開始,來談?wù)劜?..
    tangsl閱讀 4,317評論 0 23
  • 文/tangsl(簡書作者) 原文鏈接:http://www.itdecent.cn/p/2b993a4b913e...
    西葫蘆炒胖子閱讀 3,925評論 0 5
  • 程序調(diào)試的基本思想是“分析現(xiàn)象->假設(shè)錯(cuò)誤原因->產(chǎn)生新的現(xiàn)象去驗(yàn)證假設(shè)”這樣一個(gè)循環(huán)過程,根據(jù)現(xiàn)象如何假設(shè)錯(cuò)誤原...
    Manfred_Zone閱讀 16,730評論 0 26
  • 概述 GDB是一個(gè)由GNU開源組織發(fā)布的、UNIX/Linux操作系統(tǒng)下的、基于命令行的、功能強(qiáng)大的程序調(diào)試工具。...
    咕咕鷄閱讀 21,103評論 0 8
  • 1、文件和目錄: # cd /home 進(jìn)入 '/home' 目錄 # cd .. ...
    XDgbh閱讀 2,145評論 0 1

友情鏈接更多精彩內(nèi)容