日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gdb 跟踪调试命令整理

發(fā)布時間:2025/3/15 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gdb 跟踪调试命令整理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

內(nèi)容源自于陳浩CSDN博客的用GDB調(diào)試程序一系列文章

  • 用GDB調(diào)試程序(一)
  • 用GDB調(diào)試程序(二)
  • 用GDB調(diào)試程序(三)
  • 用GDB調(diào)試程序(四)
  • 用GDB調(diào)試程序(五)
  • 用GDB調(diào)試程序(六)
  • 用GDB調(diào)試程序(七)

?

GDB 調(diào)試

要進(jìn)行調(diào)試程序首先要生成一個含有調(diào)試信息的執(zhí)行程序命令如下:

  • gcc(g++) -g -o 文件名 源文件.c(源文件.cpp)
  • gcc(g++) -ggdb3 -o 文件名 源文件.c(源文件.cpp)

此時便會生成一個含有調(diào)試信息的可執(zhí)行文件,然后便可以用 gdb 去調(diào)試這個程序了,進(jìn)入調(diào)試程序命令,但是如果用 gdb 去調(diào)試一個未包含調(diào)試信息的可執(zhí)行文件則會發(fā)生錯誤

  • gdb 執(zhí)行文件名(含調(diào)試信息)

運(yùn)行 GDB

運(yùn)行 gdb

  • gdb <program> -- program也就是你的執(zhí)行文件,一般在當(dāng)然目錄下.
  • gdb <program> core -- 用 gdb 同時調(diào)試一個運(yùn)行程序和 core 文件,core 是程序非法執(zhí)行后 core dump 后產(chǎn)生的文件.
  • gdb <program> <PID> -- 調(diào)試正在運(yùn)行的程序. program 為需要調(diào)試的程序文件, PID 為當(dāng)前正在運(yùn)行的程序.或是先用 gdb <program> 關(guān)聯(lián)上源代碼進(jìn)入 gdb,后用 attach 命令來掛接進(jìn)程的 PID.并用 detach 來取消掛接的進(jìn)程

gdb 啟動常用的參數(shù)

  • 從指定文件中讀取符號表
    • -symbols <file>
    • -s <file>
  • 從指定文件中讀取符號表信息,并把他用在可執(zhí)行文件中
    • -se file
  • 調(diào)試時 core dump 的 core 文件
    • -core <file>
    • -c <file>
  • 加入一個源文件的搜索路徑.默認(rèn)搜索路徑是環(huán)境變量中 PATH 所定義的路徑
    • -directory <directory>
    • -d <directory>
  • 設(shè)置啟動時候參數(shù)
    • --args arglist

gdb 幫助文檔

  • help -- 查看 gdb 的命令種類
  • help <CmdType> -- 查看 CmdType 種類的 gdb 命令
  • apropos <keyWord> -- 查看關(guān)鍵字 keyWord 的相關(guān)命令
  • info <keyWord> -- 查看關(guān)鍵字 keyWord 調(diào)試信息
  • show <keyWord> -- 查看關(guān)鍵字 keyWord gdb 本身設(shè)置信息

gdb 中運(yùn)行 unix 的 shell 程序

  • shell <command string> -- 調(diào)用 unix 的 shell 來執(zhí)行 <command string>,環(huán)境變量 shell 中定義的 unix 的 shell 將會被用來執(zhí)行 <command string>,如果 shell 沒有定義,那就使用 unix 的標(biāo)準(zhǔn) shell:/bin/sh.(在 windows 中使用 command.com 或 cmd.exe)
  • make <make-args> -- 等價于 “shell make <make-args>”

歷史記錄

  • 當(dāng)你用 gdb 的 print 查看程序運(yùn)行時的數(shù)據(jù)時,你每一個 print 都會被 gdb 記錄下來.gdb 會以 $1, $2, $3 ...這樣的方式為你每一個 print 命令編上號.于是,你可以使用這個編號訪問以前的表達(dá)式,如 $1.這個功能所帶來的好處是,如果你先前輸入了一個比較長的表達(dá)式,如果你還想查看這個表達(dá)式的值,你可以使用歷史記錄來訪問,省去了重復(fù)輸入.

啟動程序

  • run <arg ...> -- 啟動程序,<arg ...> 為程序運(yùn)行時候需要輸入的參數(shù).也可用 set args 命令去設(shè)置運(yùn)行參數(shù).簡寫為 r

GDB 環(huán)境設(shè)置

gdb 設(shè)置

  • 設(shè)置顯示選項
    • 地址
      • set print address <on/off> -- 打開地址輸出,當(dāng)程序顯示函數(shù)信息時,gdb會顯出函數(shù)的參數(shù)地址.系統(tǒng)默認(rèn)為打開.
      • show print address -- 查看 print address 選項信息
    • 數(shù)組元素單獨(dú)行顯示
      • set print array <on/off> -- 打開時數(shù)組顯示時,每個元素占一行,如果不打開的話,每個元素則以逗號分隔.這個選項默認(rèn)是關(guān)閉的.
      • show print array -- 查看 print array 選項信息
    • 顯示數(shù)組元素顯示
      • set print elements <number-of-elements> -- 設(shè)置數(shù)組的顯示的最大長度,設(shè)置為 0,則表示不限制.
      • show print elements -- 查看 print elements 選項信息.
    • 設(shè)置字符串顯示
      • set print null-stop <on/off> -- 如果打開那么當(dāng)顯示字符串時,遇到結(jié)束符則停止顯示.這個選項默認(rèn)為 off.
      • show print null-stop -- 查看 print null-stop 選項信息
    • 設(shè)置結(jié)構(gòu)體變量顯示
      • set print pretty <on/off> -- 結(jié)構(gòu)體優(yōu)雅顯示
      • show print pretty -- 查看 gdb 是如何顯示結(jié)構(gòu)體的.
    • 設(shè)置字符顯示
      • set print sevenbit-strings <on/off> -- 符顯示,是否按“/nnn”的格式顯示,如果打開,則字符串或字符數(shù)據(jù)按/nnn顯示,如“/065”.
      • show print sevenbit-strings -- 查看字符顯示開關(guān)是否打開.
    • 設(shè)置聯(lián)合體顯示
      • set print union <on/off> -- 設(shè)置顯示結(jié)構(gòu)體時,是否顯式其內(nèi)的聯(lián)合體數(shù)據(jù).
      • show print union -- 查看聯(lián)合體數(shù)據(jù)的顯示方式
    • 設(shè)置對象顯示
      • set print object <on/off> -- 在 C++ 中,如果一個對象指針指向其派生類,如果打開這個選項,gdb 會自動按照虛方法調(diào)用的規(guī)則顯示輸出,如果關(guān)閉這個選項的話,gdb 就不管虛函數(shù)表了.這個選項默認(rèn)是 off.
      • show print object -- 查看對象選項的設(shè)置.
    • 設(shè)置靜態(tài)成員顯示
      • set print static-members <on/off> -- 這個選項表示,當(dāng)顯示一個 C++ 對象中的內(nèi)容是,是否顯示其中的靜態(tài)數(shù)據(jù)成員.默認(rèn)是 on.
      • show print static-members -- 查看靜態(tài)數(shù)據(jù)成員選項設(shè)置.
    • 設(shè)置虛函數(shù)表顯示
      • set print vtbl <on/off> -- 當(dāng)此選項打開時,gdb 將用比較規(guī)整的格式來顯示虛函數(shù)表時.其默認(rèn)是關(guān)閉的.
      • show print vtbl -- 查看虛函數(shù)顯示格式的選項.
  • 設(shè)置運(yùn)行程序的相關(guān)環(huán)境及其參數(shù)
    • 指定源文件的路徑
      • directory <dirname ... > -- 加一個源文件路徑到當(dāng)前路徑的前面.如果你要指定多個路徑,UNIX 下你可以使用“:”,Windows 下你可以使用“;”.縮寫 dir
      • directory -- 清除所有的自定義的源文件搜索路徑信息.
      • show directories -- 顯示定義了的源文件搜索路徑.
    • 運(yùn)行參數(shù)
      • set args -- 可指定運(yùn)行時參數(shù)
      • show args -- 命令可以查看設(shè)置好的運(yùn)行參數(shù)
    • 運(yùn)行環(huán)境
      • path <dir> -- 可設(shè)定程序的運(yùn)行路徑
      • show paths -- 查看程序的運(yùn)行路徑
      • set environment varname=value -- 設(shè)置環(huán)境變量
      • show environment [varname] -- 查看環(huán)境變量
    • 工作目錄
      • cd <dir> -- 相當(dāng)于shell的cd命令
      • pwd -- 顯示當(dāng)前的所在目錄
    • 程序的輸入輸出
      • info terminal -- 顯示你程序用到的終端的模式
      • tty -- 命令可以指寫輸入輸出的終端設(shè)備
      • 重定向控制程序輸出
    • 堆棧幀設(shè)置
      • set backtrace <limit> -- 設(shè)置堆棧幀的最大顯示數(shù)量,默認(rèn)是沒有限制
    • 調(diào)試模式
      • set step-mode [on | off] -- step-mode 模式,于是,在進(jìn)行單步跟蹤時,程序不會因為沒有debug信息而不停住.這個參數(shù)有很利于查看機(jī)器碼.?

GDB 源碼查看

顯示源代碼

  • list <linenum> -- 顯示程序第 linenum 行的周圍的源程序.
  • list <function> -- 顯示函數(shù)名為 function 的函數(shù)的源程序.
  • list <filename:linenum> -- 哪個文件的哪一行.
  • list <filename:function> -- 哪個文件中的哪個函數(shù).
  • list <offset> -- 當(dāng)前行號的正/負(fù) offset 偏移量那那行.
  • list -- 顯示當(dāng)前行后面的源程序.
  • list - -- 顯示當(dāng)前行前面的源程序.
  • list <first>, <last> -- 顯示從 first 行到 last 行之間的源代碼.若無 first 則顯示從當(dāng)前行到 last 之間的源代碼.

設(shè)置和獲得顯示源碼的行數(shù)

  • set listsize <count> -- 設(shè)置一次顯示源代碼的行數(shù).
  • show listsize -- 查看當(dāng)前l(fā)istsize的設(shè)置.

搜索源代碼

  • forward-search <regexp> -- 向后面搜索.正則表達(dá)式為 regexp 的關(guān)鍵字
  • search <regexp> -- 向后面搜索.正則表達(dá)式為 regexp 的關(guān)鍵字
  • reverse-search <regexp> -- 向前面搜索.正則表達(dá)式為 regexp 的關(guān)鍵字

源代碼的內(nèi)存

  • info line <linenum> -- 查看行號為 linenum 源代碼在內(nèi)存中的地址.
  • info line <function> -- 查看函數(shù)在源代碼在內(nèi)存中的地址.
  • info line <filename:linenum> -- 查看 filename 文件的第 linenum 行源代碼在內(nèi)存中的地址.
  • info line <filename:function> -- 查看 filename 文件的 function 函數(shù)在源代碼在內(nèi)存中的地址.

查看匯編代碼

  • disassemble -- 查看源程序的當(dāng)前執(zhí)行時的機(jī)器碼,這個命令會把目前內(nèi)存中的指令 dump 出來.

GDB 停止點(diǎn)設(shè)置及維護(hù)

斷點(diǎn)(BreakPoint)

  • 設(shè)置斷點(diǎn):(threadno 指定了線程的 ID,注意,這個 ID 是 gdb 分配的,可以通過 "info threads" 命令來查看正在運(yùn)行程序中的線程信息)
    • break thread <threadno> -- break命令沒有參數(shù)時,表示在下一條指令處停住.
    • break +offset thread <threadno> -- 在當(dāng)前行號的后面的 offset 行停住.(offiset 為自然數(shù))
    • break -offset thread <threadno> -- 在當(dāng)前行號的前面的 offset 行停住.(offiset 為自然數(shù))
    • break <linenum> thread <threadno> -- 在指定行號停住.
    • break filename:linenum thread <threadno> -- 在源文件filename的linenum行處停住.
    • break <function> thread <threadno> -- 在進(jìn)入指定函數(shù)時停住.
    • break filename:function thread <threadno> --在源文件filename的function函數(shù)的入口處停住.
    • break *address -- 在程序運(yùn)行的內(nèi)存地址處停住.
    • break ... thread <threadno> if <condition> -- ...可以是上述的參數(shù),condition表示條件,在條件成立時停住.比如在循環(huán)境體中,可以設(shè)置break if i=100,表示當(dāng)i為100時停住程序.
    • tbreak -- 設(shè)置只停止一次的斷點(diǎn).用法和 break 類似
  • 查看斷點(diǎn)
    • info breakpoints [n]
    • info break [n]

觀察點(diǎn)(WatchPoint) --?觀察點(diǎn)一般來觀察某個表達(dá)式(變量也是一種表達(dá)式)的值是否有變化了,如果有變化,馬上停住程序.

  • 設(shè)在觀察點(diǎn)
    • watch <expr> -- 為表達(dá)式(變量)expr設(shè)置一個觀察點(diǎn).一量表達(dá)式值有變化時,馬上停住程序.
    • rwatch <expr> -- 當(dāng)表達(dá)式(變量)expr被讀時,停住程序.
    • awatch <expr> -- 當(dāng)表達(dá)式(變量)的值被讀或被寫時,停住程序.
  • 查看觀察點(diǎn)
    • info watchpoints -- 列出當(dāng)前所設(shè)置了的所有觀察點(diǎn).

捕捉點(diǎn)(CatchPoint) --?設(shè)置捕捉點(diǎn)來補(bǔ)捉程序運(yùn)行時的一些事件.如:載入共享庫(動態(tài)鏈接庫)或是 C++ 的異常《/p>

  • 設(shè)置捕捉點(diǎn)
    • catch <event> -- 當(dāng)event發(fā)生時,停住程序.event可以是下面的內(nèi)容:
      • throw 一個 C++ 拋出的異常.(throw 為關(guān)鍵字)
      • catch 一個 C++ 捕捉到的異常.(catch 為關(guān)鍵字)
      • exec 調(diào)用系統(tǒng)調(diào)用 exec 時.(exec 為關(guān)鍵字,目前此功能只在 HP-UX 下有用)
      • fork 調(diào)用系統(tǒng)調(diào)用 fork 時.(fork 為關(guān)鍵字,目前此功能只在 HP-UX 下有用)
      • vfork 調(diào)用系統(tǒng)調(diào)用 vfork 時.(vfork 為關(guān)鍵字,目前此功能只在 HP-UX 下有用)
      • load 或 load <libname> 載入共享庫(動態(tài)鏈接庫)時.(load 為關(guān)鍵字,目前此功能只在 HP-UX 下有用)
      • unload 或 unload <libname> 卸載共享庫(動態(tài)鏈接庫)時.(unload 為關(guān)鍵字,目前此功能只在 HP-UX 下有用)
    • tcatch <event> -- 只設(shè)置一次捕捉點(diǎn),當(dāng)程序停住以后,應(yīng)點(diǎn)被自動刪除.

維護(hù)停止點(diǎn)

  • 清除停止點(diǎn)
    • clear -- 所有的已定義的停止點(diǎn).
    • clear <function> -- 清除所有設(shè)置在函數(shù)上的停止點(diǎn).
    • clear <filename:function> -- 清除所有設(shè)置在函數(shù)上的停止點(diǎn).
    • clear <linenum> -- 清除所有設(shè)置在指定行上的停止點(diǎn).
    • clear <filename:linenum> -- 清除所有設(shè)置在指定行上的停止點(diǎn).
  • 刪除停止點(diǎn)
    • delete [range] -- 刪除停止點(diǎn).其簡寫命令為 d.
  • 禁用停止點(diǎn)
    • disable [range] -- 禁用停止點(diǎn)
  • 啟用停止點(diǎn)
    • enable [range] -- 啟用停止點(diǎn).
    • enable once [rang] -- 啟用停止點(diǎn)一次,當(dāng)程序停止后,該停止點(diǎn)馬上被 gdb 自動 disable.
    • enable count [rang] -- 啟用停止點(diǎn) count 次,當(dāng)程序停止后,該停止點(diǎn)馬上被 gdb 自動 disable.
    • enable delete [rang] -- 啟用停止點(diǎn)一次,當(dāng)程序停止后,該停止點(diǎn)馬上被 gdb 自動刪除.
  • 停止條件維護(hù) --?以用 condition 命令來修改斷點(diǎn)的條件.(只有break和watch命令支持if,catch目前暫不支持if)
    • condition <bnum> <expression> -- 修改斷點(diǎn)號為bnum的停止條件為expression.
    • condition <bnum> -- 清除斷點(diǎn)號為bnum的停止條件.
  • 忽略停止點(diǎn) N 次
    • ignore <bnum> <count> -- 表示忽略斷點(diǎn)號為 bnum 的停止條件 count 次.
  • 為停止點(diǎn)設(shè)定運(yùn)行命令
    • 格式:
      commands [bnum]
      ? ? ? ?... command-list ...
      ? ? ? ?// 為斷點(diǎn)號 bnumi寫一個命令列表.當(dāng)程序被該斷點(diǎn)停住時,gdb 依次運(yùn)行命令列表中的命令.
      end
    • 例如:
      break foo if x>0
        commands
      ? ? ? ?printf "x is %d/n",x
      ? ? ? ?continue
      end

信號(Signals)

添加信號處理

  • handle <signal> <keywords...>在 gdb 中定義一個信號處理.信號 <signal> 可以以 SIG 開頭或不以 SIG 開頭,可以用定義一個要處理信號的范圍(如:SIGIO-SIGKILL,表示處理從 SIGIO 信號到 SIGKILL 的信號,其中包括 SIGIO, SIGIOT, SIGKILL 三個信號),也可以使用關(guān)鍵字 all 來標(biāo)明要處理所有的信號.一旦被調(diào)試的程序接收到信號,運(yùn)行程序馬上會被 gdb 停住,以供調(diào)試.其 <keywords> 可以是以下幾種關(guān)鍵字的一個或多個.若沒有 keywords 則查看奇信號的處理狀態(tài)
    • nostop -- 當(dāng)被調(diào)試的程序收到信號時,gdb 不會停住程序的運(yùn)行,但會打出消息告訴你收到這種信號.
    • stop -- 當(dāng)被調(diào)試的程序收到信號時,gdb 會停住你的程序.
    • print -- 當(dāng)被調(diào)試的程序收到信號時,gdb 會顯示出一條信息.
    • noprint -- 當(dāng)被調(diào)試的程序收到信號時,gdb 不會告訴你收到信號的信息.
    • pass -- 當(dāng)被調(diào)試的程序收到信號時,gdb 不處理信號.這表示,gdb 會把這個信號交給被調(diào)試程序會處理.
    • noignore -- 當(dāng)被調(diào)試的程序收到信號時,gdb 不處理信號.這表示,gdb 會把這個信號交給被調(diào)試程序會處理.
    • nopass -- 當(dāng)被調(diào)試的程序收到信號時,gdb 不處理信號.這表示,gdb 會把這個信號交給被調(diào)試程序會處理.
    • 1gnore -- 當(dāng)被調(diào)試的程序收到信號時,gdb 不會讓被調(diào)試程序來處理這個信號.

查看處理信號

  • info signals -- 查看有哪些信號在被 gdb 檢測中.
  • info handle -- 查看有哪些信號在被 gdb 檢測中.

GDB 程序調(diào)試

恢復(fù)執(zhí)行

  • continue [ignore-count] -- ignore-count 表示忽略其后的斷點(diǎn)次數(shù).恢復(fù)程序運(yùn)行,直到程序結(jié)束,或是下一個斷點(diǎn)到來.縮寫 c
  • fg [ignore-count] -- ignore-count 表示忽略其后的斷點(diǎn)次數(shù).恢復(fù)程序運(yùn)行,直到程序結(jié)束,或是下一個斷點(diǎn)到來.縮寫 c

單步調(diào)試

  • step <count> -- 單步跟蹤,如果有函數(shù)調(diào)用,它會進(jìn)入該函數(shù).count 表示執(zhí)行后面 count 條語句,不加則默認(rèn)為 1.
  • next <count> -- 同樣單步跟蹤,如果有函數(shù)調(diào)用,他不會進(jìn)入該函數(shù).count 表示執(zhí)行后面 count 條語句,不加則默認(rèn)為 1.

跟蹤機(jī)器指令
? ? ? ?與之一樣有相同功能的命令是 “display/i $pc” ,當(dāng)運(yùn)行完這個命令后,單步跟蹤會在打出程序代碼的同時打出機(jī)器指令(也就是匯編代碼)

  • stepi 或 si -- 單步跟蹤一條機(jī)器指令,簡寫 si
  • nexti 或 ni -- 單步跟蹤一條機(jī)器指令,簡寫 ni

函數(shù)調(diào)試

  • finish -- 運(yùn)行程序,直到當(dāng)前函數(shù)完成返回.并打印函數(shù)返回時的堆棧地址和返回值及參數(shù)值等信息.
  • return <expression> -- 使函數(shù)以 expression 表達(dá)式返回出去,忽略還沒有執(zhí)行的語句.若無返回 void 出去
  • call <expr> -- 表達(dá)式中可以一是函數(shù),以此達(dá)到強(qiáng)制調(diào)用函數(shù)的目的.并顯示函數(shù)的返回值,如果函數(shù)返回值是void,那么就不顯示.
  • print 與 printf 也可以做到類似的功能和 call 的不同是,如果函數(shù)返回 void,call 則不顯示,print 則顯示函數(shù)返回值,并把該值存入歷史數(shù)據(jù)中.

循環(huán)體調(diào)試

  • until -- 可以運(yùn)行程序直到退出循環(huán)體.簡寫 u

修改變量值

  • print varname=var -- 修改被調(diào)試程序運(yùn)行時的變量值
  • set var varname=value -- 修改被調(diào)試程序運(yùn)行時的變變量
  • whatis varname -- 查看變量的類型

跳轉(zhuǎn)執(zhí)行

  • jump <linespec> -- 指定下一條語句的運(yùn)行點(diǎn).<linespce> 可以是文件的行號,可以是 file:line 格式,可以是 +num 這種偏移量格式.表式著下一條運(yùn)行語句從哪里開始.
  • jump <address> -- 跳轉(zhuǎn)到指定的程序內(nèi)存地址運(yùn)行.<address> 是代碼行的內(nèi)存地址.
  • 注意
    • jump 指令不會改變當(dāng)前的程序棧中的內(nèi)容,所以,當(dāng)你從一個函數(shù)跳到另一個函數(shù)時,當(dāng)函數(shù)運(yùn)行完返回時進(jìn)行彈棧操作時必然會發(fā)生錯誤.
    • jump 命令只是改變了指令寄存器中的值.于是可以使用 “set $pc” 來更改跳轉(zhuǎn)執(zhí)行的地址.如: set $pc = 0x485

產(chǎn)生信號量

  • signal <signal> -- 產(chǎn)生一個 signal 信號.UNIX 的系統(tǒng)信號量通常從 1 到 15.所以 <signal> 取值也在這個范圍.

GDB 運(yùn)行是數(shù)據(jù)

查看運(yùn)行時數(shù)據(jù)

  • print /<f> <expr> -- 查看當(dāng)前程序的運(yùn)行數(shù)據(jù).簡寫 p.
    • <expr> 是表達(dá)式
      • @ -- 是一個和數(shù)組有關(guān)的操作符,在后面會有更詳細(xì)的說明.在 @ 左邊是數(shù)組的地址,右邊是數(shù)組的長度,eg: array@len
      • :: -- 指定一個在文件或是一個函數(shù)中的變量.
      • {<type>} <addr> --表示一個指向內(nèi)存地址<addr>的類型為type的一個對象.
    • <f>是輸出的格式
      • d -- 按十進(jìn)制格式顯示變量.
      • u -- 按十六進(jìn)制格式顯示無符號整型.
      • o -- 按八進(jìn)制格式顯示變量.
      • t -- 按二進(jìn)制格式顯示變量.
      • a -- 按十六進(jìn)制格式顯示變量.
      • c -- 按字符格式顯示變量.
      • f -- 按浮點(diǎn)數(shù)格式顯示變量.
    • 注意:
      • 1.若出現(xiàn)變量重名,局部變量會隱藏全局變量.若想查看全局變量的值時,可以使用“::”操作符.
      • 2.可以通過這種形式指定你所想查看的變量 eg:
        ? ? *'filename'::variable
        ? ? *function::variable
  • printf "fmt",arg,... -- 打印格式化字符燦 fmt.

查看內(nèi)存

  • examine/<n/f/u> <addr> -- 來查看內(nèi)存地址中的值.簡寫 x
    • <n/f/u>
      • n 是一個正整數(shù),表示顯示內(nèi)存的長度,也就是說從當(dāng)前地址向后顯示幾個地址的內(nèi)容.
      • f 表示顯示的格式
        • s -- 按字符串格式顯示內(nèi)存地址內(nèi)容.
        • i -- 查看內(nèi)存地址的機(jī)器指令內(nèi)容
        • x -- 按十六進(jìn)制格式顯示地址內(nèi)容.
        • d -- 按十進(jìn)制格式顯示地址內(nèi)容.
        • u -- 按十六進(jìn)制格式顯示無符號整型.
        • o -- 按八進(jìn)制格式顯示地址內(nèi)容.
        • t -- 按二進(jìn)制格式顯示地址內(nèi)容.
        • a -- 按十六進(jìn)制格式顯示地址內(nèi)容.
        • c -- 按字符格式顯示地址內(nèi)容.
        • f -- 按浮點(diǎn)數(shù)格式顯示地址內(nèi)容.
      • u 表示從當(dāng)前地址往后請求的字節(jié)數(shù),如果不指定的話,gdb默認(rèn)是 4 個 bytes.
        • b -- 表示單字節(jié)
        • h -- 表示雙字節(jié)
        • w -- 表示四字節(jié)
        • g -- 表示八字節(jié)
    • <addr> 表示一個內(nèi)存地址.

自動顯示

  • 設(shè)置自動顯示
    • display/<fmt> <expr> -- 自動顯示 expr 表達(dá)式
    • display/<fmt> <addr> -- 自動顯示 addr 地址
      • fmt 表示顯示的格式
      • i -- 輸出格式為機(jī)器指令碼,也就是匯編.
      • s -- 輸出格式為字符串
  • 刪除自動顯示
    • undisplay <range> -- 刪除自動顯示
    • delete display <range> -- 刪除自動顯示
  • 啟用和禁自動顯示
    • sable display <range> -- 禁用自動顯示
    • enable display <range> -- 啟動自動顯示

查看棧信息

  • backtrace <n> -- 擦看函數(shù)棧信息,簡寫 bt
    • n 若是正數(shù),只打印棧頂上 n 層的棧信息,
    • 若是負(fù)數(shù),只打印棧頂下 n 層的棧信息,
    • 若無則打印當(dāng)前的函數(shù)調(diào)用棧的所有信息
  • frame -- 會打印出這些信息:棧的層編號,當(dāng)前的函數(shù)名,函數(shù)參數(shù)值,函數(shù)所在文件及行號,函數(shù)執(zhí)行到的語句.
  • info frame -- 這個命令會打印出更為詳細(xì)的當(dāng)前棧層的信息,只不過,大多數(shù)都是運(yùn)行時的內(nèi)內(nèi)地址.
  • info args -- 打印出當(dāng)前函數(shù)的參數(shù)名及其值.
  • info locals -- 打印出當(dāng)前函數(shù)中所有局部變量及其值.
  • info catch -- 打印出當(dāng)前的函數(shù)中的異常處理信息.

切換函數(shù)棧位置

  • frame <n> -- 切換到第 n 層函數(shù)棧位置,簡寫 f.
  • p <n> -- 表示上面移動 n 層,可以不打 n,表示向上移動一層.
  • down <n> -- 表示向棧的下面移動 n 層,可以不打 n,表示向下移動一層.
  • select-frame <n> -- 類似 frame 命令.不打印出棧層信息.
  • up-silently <n> -- 類似 up 命令.不打印出棧層信息.
  • down-silently <n> -- 類似 down 命令.不打印出棧層信息.

查看寄存器

  • info registers -- 查看寄存器的情況.(除了浮點(diǎn)寄存器)
  • info all-registers -- 查看所有寄存器的情況.(包括浮點(diǎn)寄存器)
  • info registers <regname> -- 查看所指定的寄存器的情況.

線程查看與切換線程

  • info threads -- 查看當(dāng)前線程
  • thread <threadno> -- 切換到 threadno 的線程,簡寫 t

自定義命令

定義一個命令

  • 格式
    define comdName
    ? ? ? ...
    end
  • 條件語句
    if cond_expr
    ? ? ? ...
    else
    ? ? ? ...
    end
  • 循環(huán)語句
    while cond_expr
    ? ? ? ...
    end

定義一個命令的文檔信息(在 help cmdName 的時候顯示)

  • document cmdName
    ? ? ? ...
    end

查看自定命令

  • help user-define -- 查看所有用戶自定義的命令
  • show user cmdName -- 查看用戶定義的 cmdName 的命令.
  • help cmdName -- 查看用戶自定義的 cmdName 的幫助文檔
  • show max-user-call-depth -- 查看用戶自定義命令的遞歸最大深度,缺省是 1024
  • set-user-call-depth <limit>-- 設(shè)置用戶自定義命令的遞歸最大深度.
轉(zhuǎn)自:?http://www.cnblogs.com/kzloser/archive/2012/09/21/2697185.html


補(bǔ)充:
可以使用qemu軟件在PC上模擬運(yùn)行
1)安裝qemu
sudo apt-get install (聯(lián)網(wǎng))
qemu tar.gz (安裝包)
cd ~/esd1503
cp /mnt/hgfs/esd1503/arm/env/qemu tar.gz/
tar xf qemu.tar.gz
cd qemu/
sudo dpkg -i *
2)使用qemu
a)arm-linux-gcc -v 4.4.1
b)生成的目標(biāo)文件中應(yīng)該包含調(diào)試信息
使用步驟
a)重新編譯程序 -g
arm-linux-as -o sum.o sum.s
arm-linux-ld -o sum sum.o
b)啟動調(diào)試的服務(wù)器
qemu-arm -g 1234 sum
c) 開啟新的窗口
cd esd1503/arm/day08/01
arm-linux-gdb sum
(gdb)target remote localhost:1234
(gdb)n ? ? /* 執(zhí)行下一步 */
(gdb)info reg ?/* 執(zhí)行結(jié)果 */


gdb的簡單使用:
gcc -g
gdb a.out
(gdb)list
(gdb)b 8
(gdb)r
(gdb)p i
(gdb)n
(gdb)p i
(gdb)q

總結(jié)

以上是生活随笔為你收集整理的gdb 跟踪调试命令整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。