GDB 調試 一些命令


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)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 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是什么類型的變量


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM