GDB 調試 一些命令

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命令行

  • (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)stepinexti的區別: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. stopnostopnostop表示當GDB收到指定的信號,不會應用中止程序的執行,只會打印出一條收到信號的消息,所以,nostop也暗含了下面的print; 而stop則表示,當GDB收到指定的信號,中止應用程序的執行。
b. printnoprintprint表示若是收到指定的信號,打印出一條信息; noprintprint表示相反的意思
c. passnopasspass表示若是收到指定的信號,把該信號通知給應用程序; nopass表示與pass相反的意思
d. ignorenoignoreignorenopass同義,同理,noignorepass同義

 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是什麼類型的變量
相關文章
相關標籤/搜索