1.
gdb查看指定地址的內存地址的值:examine 簡寫 x-----使用gdb> help x 來查看使用方式
x/ (n,f,u為可選參數)
n: 需要顯示的內存單元個數,也就是從當前地址向后顯示幾個內存單元的內容,一個內存單元的大小由后面的u定義
f:顯示格式
x(hex) 按十六進制格式顯示變量。
d(decimal) 按十進制格式顯示變量。
u(unsigned decimal) 按十進制格式顯示無符號整型。
o(octal) 按八進制格式顯示變量。
t(binary) 按二進制格式顯示變量。
a(address) 按十六進制格式顯示變量。
c(char) 按字符格式顯示變量。
f(float) 按浮點數格式顯示變量
例如:
你可以使用examine命令(簡寫是x)來查看內存地址中的值。x命令的語法如下所示: x/<n/f/u> <addr> n、f、u是可選的參數。 n是一個正整數,表示顯示內存的長度,也就是說從當前地址向后顯示幾個地址的內容。 f 表示顯示的格式,參見上面。如果地址所指的是字符串,那么格式可以是s,如果 地址是指令地址,那么格式可以是i。 u 表示從當前地址往后請求的字節數,如果不指定的話,GDB默認是4個bytes。u參數可以用下面的字符來代替,b表示單字節,h表示雙字節,w表示四字 節,g表示八字節。當我們指定了字節長度后,GDB會從指內存定的內存地址開始,讀寫指定字節,並把其當作一個值取出來。 <addr>表示一個內存地址。 n/f/u三個參數可以一起使用。例如: 命令:x/3uh 0x54320 表示,從內存地址0x54320讀取內容,h表示以雙字節為一個單位,3表示三個單位,u表示按十六進制顯示。 輸出格式 一般來說,GDB會根據變量的類型輸出變量的值。但你也可以自定義GDB的輸出的格式。例如,你想輸出一個整數的十六進制,或是二進制來查看這個整型變量的中的位的情況。要做到這樣,你可以使用GDB的數據顯示格式: x 按十六進制格式顯示變量。 d 按十進制格式顯示變量。 u 按十六進制格式顯示無符號整型。 o 按八進制格式顯示變量。 t 按二進制格式顯示變量。 a 按十六進制格式顯示變量。 c 按字符格式顯示變量。 f 按浮點數格式顯示變量。 (gdb) p i $21 = 101 (gdb)p/a i $22 = 0x65 (gdb)p/c i $23 = 101 'e' (gdb)p/f i $24 = 1.41531145e-43 (gdb)p/x i $25 = 0x65 (gdb)p/t i $26 = 1100101 ==================================== 【yasi】 1)用x命令查看內存 x/3uh 0x54320從地址0x54320開始,讀取3個雙字節(h),以十六進制方式顯示(u) 3可以替換成任意正整數 u可以替換成: d 按十進制格式顯示變量 x 按十六進制格式顯示變量 a 按十六進制格式顯示變量 u 按十六進制格式顯示無符號整型 o 按八進制格式顯示變量 t 按二進制格式顯示變量 c 按字符格式顯示變量 f 按浮點數格式顯示變量 h可以替換成: b表示單字節,h表示雙字節,w表示四字 節,g表示八字節 2)p命令中加參數以不同形式打印變量的值 (gdb)p/a i 或 (gdb)p/x i $22 = 0x65 (gdb)p/c i $23 = 101 'e' (gdb)p/f i $24 = 1.41531145e-43 (gdb)p/t i $26 = 1100101
u:每個單元的大小,按字節數來計算。默認是4 bytes。GDB會從指定內存地址開始讀取指定字節,並把其當作一個值取出來,並使用格式f來顯示
b:1 byte h:2 bytes w:4 bytes g:8 bytes
比如x/3uh 0x54320表示從內存地址0x54320讀取內容,h表示以雙字節為單位,3表示輸出3個單位,u表示按照十六進制顯示。
from http://www.cnblogs.com/super119/archive/2011/03/26/1996125.html
gdb打印表達式的值:print/f 表達式
f是輸出的格式,x/d/u/o/t/a/c/f
表達式可以是當前程序的const常量,變量,函數等內容,但是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)
PS:多個源文件時指定breakpoint的位置
當有多個源文件的時候需要制定源文件設置斷點:
break filename:linenum
break filename:func
例如:
bool_t CManifestFile::parseManifestFile(const std::string& mnfName)
如果有多層目錄,則
在gdb中,用dir命令把你所想加入的文件的目錄指定出來,然后b 命令就可以用了。
就是類似這樣的:
dir ../app(相對路徑,絕對路徑都行)
b app2:XXX
XXX:為你所設置斷點的行數
2.轉自http://blog.chinaunix.net/uid-20760757-id-1872358.html
本文是手把手教你玩轉GDB的第三篇,主要內容是介紹一些在程序調試過程中最常用的GDB命令,廢話不多話,開始今天的正題。
1.attach process-id/detach
- (1)attach process-id: 在GDB狀態下,開始調試一個正在運行的進程,其進程ID為process-id
- (2)detach: 停止調試當前正在調試有進程,與attach配對試用
2.kill
- (1)基本功能:殺掉當前GDB正在調試的應用程序所對應的子進程
- (2)如果想不退出GDB而對當前正在調試的應用程序重新編譯、鏈接,可以在GDB中執行kill殺掉子進程,等編譯、鏈接完后,再重新執行run,GDB便可加載新的可執行程序啟動調試
3.多線程程序調試相關:
- (1)thread threadno:切換當前線程到由threadno指定的線程
- (2)info threads:查看GDB當前調試的程序的各個線程的相關信息
- (3)thread apply [threadno] [all] args:對指定(或所有)的線程執行由args指定的命令
4.多進程程序調試相關(fork/vfork):
- (1)缺省方式:fork/vfork之后,GDB仍然調試父進程,與子進程不相關
- (2)set follow-fork-mode mode:設置GDB行為,mode為parent時,與缺省情況一樣;mode為child時,fork/vfork之后,GDB進入子進程調試,與父進程不再相關
- (3)show follow-fork-mode:查看當前GDB多進程跟蹤模式的設置
5.step & stepi
- (1)step [count]: 如果沒有指定count, 則繼續執行程序,直到到達與當前源文件不同的源文件中時停止;如果指定了count, 則重復行上面的過程count次
- (2)stepi [count]: 如果沒有指定count, 繼續執行下一條機器指令,然后停止;如果指定了count,則重復上面的過程count次
- (3)step比較常見的應用場景:在函數func被調用的某行代碼處設置斷點,等程序在斷點處停下來后,可以用step命令進入該函數的實現中,但前提是該函數編譯的時候把調試信息也編譯進去了,負責step會跳過該函數。
6.next & nexti
- (1)next [count]: 如果沒有指定count, 單步執行下一行程序;如果指定了count,單步執行接下來的count行程序
- (2)nexti [count]: 如果沒有指定count, 單步執行下一條指令;如果指定了count, 音頻執行接下來的count條執行
- (3)stepi和nexti的區別:nexti在執行某機器指令時,如果該指令是函數調用,那么程序執行直到該函數調用結束時才停止。
7.continue [ignore-count] 喚醒程序,繼續運行,至到遇到下一個斷點,或者程序結束。如果指定ignore-count,那么程序在接下來的運行中,忽略ignore-count次斷點。
8. finish & return - (1)finish: 繼續執行程序,直到當前被調用的函數結束,如果該函數有返回值,把返回值也打印到控制台
- (2)return [expression]: 中止當前函數的調用,如果指定了expression,把expresson值當做當前函數的返回值;如果沒有,直接結束當前函數調用
9.信號的處理
- (1)info signals & info handle:打印所有的信號相關的信息,以及GDB缺省的處理方式:
(2)handle signal action: 設置GDB對具體某個信號的處理方式。signal可以為信號整數值,也可以為SIGSEGV這樣的符號。action的取值有:
a. stop和nostop: nostop表示當GDB收到指定的信號,不會應用停止程序的執行,只會打印出一條收到信號的消息,因此,nostop也暗含了下面的print; 而stop則表示,當GDB收到指定的信號,停止應用程序的執行。
b. print和noprint: print表示如果收到指定的信號,打印出一條信息; noprint與print表示相反的意思
c. pass和nopass:pass表示如果收到指定的信號,把該信號通知給應用程序; nopass表示與pass相反的意思
d. ignore和noignore: ignore與nopass同義,同理,noignore與pass同義
1. cmake支持gdb的實現,
首先在CMakeLists.txt下加入
SET(CMAKE_BUILD_TYPE "Debug")
在下面加入:
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
原因是CMake 中有一個變量 CMAKE_BUILD_TYPE ,可以的取值是 Debug Release RelWithDebInfo >和 MinSizeRel。
當這個變量值為 Debug 的時候,CMake 會使用變量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串作為編譯選項生成 Makefile;
2. 在GDB中間加入程序啟動參數
比如我們需要調試一個可執行文件./a.out help
這時
$gdb ./a.out
進入到gdb的命令行模式下,然后:
(gdb) set args help
就能加上可執行文件需要的參數,如果要看argc[1]到argc[N]的參數,只需要
(gdb) show args
3. gdb中查看字符串,地址的操作,數據類型
比始有一個int型的變量i,相要知道他的相關信息,可以
(gdb) print i
打印出變量i的當前值
(gdb)x &i
與上面的命令等價。
如果有x命令看時,需要看一片內存區域,(如果某個地方的值為0,用x時會自動截斷了)
(gdb) x/16bx address
單字節16進制打印address地址處的長度為16的空間的內存,16表示空間長度,不是16進制,x表示16進制,b表示byte單字節
gdb看變量是哪個數據類型
(gdb) whatis i
即可知道i是什么類型的變量