1.html
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)express
若是有多層目錄,則多線程
在gdb中,用dir命令把你所想加入的文件的目錄指定出來,而後b 命令就能夠用了。app
就是相似這樣的:函數
dir ../app(相對路徑,絕對路徑都行)ui
b app2:XXXspa
XXX:爲你所設置斷點的行數.net
2.轉自http://blog.chinaunix.net/uid-20760757-id-1872358.html
本文是手把手教你玩轉GDB的第三篇,主要內容是介紹一些在程序調試過程當中最經常使用的GDB命令,廢話很少話,開始今天的正題。
1.attach process-id/detach命令行
2.kill線程
3.多線程程序調試相關:
4.多進程程序調試相關(fork/vfork):
5.step & stepi
6.next & nexti
7.continue [ignore-count] 喚醒程序,繼續運行,至到遇到下一個斷點,或者程序結束。若是指定ignore-count,那麼程序在接下來的運行中,忽略ignore-count次斷點。
8. finish & return
9.信號的處理
(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 args3. 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是什麼類型的變量