日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

      首頁編程開發(fā)其它知識 → UNIX下命令行調(diào)試工具GDB使用教程

      UNIX下命令行調(diào)試工具GDB使用教程

      相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時間:2012/12/27 0:55:27字體大。A-A+

      作者:西西點擊:0次評論:0次標簽: 調(diào)試工具

      • 類型:反編譯(譯逆工程)大小:1.8M語言:中文 評分:5.0
      • 標簽:
      立即下載

      GDB是GNU開源組織發(fā)布的一個強大的UNIX下的程序調(diào)試工具。它是一種強大的命令行調(diào)試工具。

      一般來說,調(diào)試器的功能:

      能夠運行程序,設(shè)置所有能影響程序運行的參數(shù);

      能夠讓程序在指定條件下停止運行;

      能夠在程序停止時檢查所有參數(shù)的情況;

      能夠根據(jù)指定條件改變程序的運行。

      gdb調(diào)試源代碼流程:

      1)進入GDB  #gdb test

      只需輸入GDB和要調(diào)試的可執(zhí)行文件即可,在GDB的啟動畫面中指出了GDB的版本號、遵循的許可等信息,接下來就進入了由"(gdb)"開頭的命令行界面了;

      2)查看文件  (gdb) l

      在GDB中鍵入"l"(list)就可以查看程序的源碼了,GDB列出的源代碼中明確地給出了對應(yīng)的行號,方便代碼的定位;

      3)設(shè)置斷點  (gdb) b 6

      只需在"b"(break)后加入對應(yīng)的行號即可,在GDB中利用行號設(shè)置斷點是指代碼運行到對應(yīng)行之前暫停;設(shè)置斷點可以使程序執(zhí)行到某個位置時暫停,程序員在該位置處可以方便地查看變量的值、堆棧情況等;

      一般情況下,源代碼中大家行號與用戶書寫程序的行號是一致的,但有時由于用戶的某些編譯選項會導致行號不一致的情況,因此,一定要查看在GDB中的行號;

       4)查看斷點處情況  (gdb) info b

      可以鍵入"info b"來查看斷點處情況,可以設(shè)置多個斷點;

      5)運行代碼  (gdb) r

      GDB默認從首行開始運行代碼,鍵入"r"(run)即可;程序運行到斷點處停止。

      6)看變量值  (gdb) p n

      在程序暫停之后,程序員可以查看斷點處的相關(guān)變量值,在GDB中只需鍵入"p 變量名"(print)即可;

      GDB在顯示變量值時都會在對應(yīng)值之前加上"$N"標記,它是當前變量值的引用標記,以后若想再次引用此變量,就可以直接寫作"$N",而無需寫冗長的變量名;

      7)觀察變量  (gdb) watch n

       在某一循環(huán)處,往往希望能夠觀察一個變量的變化情況,這時就可以鍵入命令"watch"來觀察變量的變化情況,GDB在"n"設(shè)置了觀察點;

      8)單步運行  (gdb) n

      單步運行是指一次只運行一條語句,這樣可以方便查看程序運行的結(jié)果,在此處只需鍵入"n"(next)即可;隨著程序的單步運行,當變量n的值發(fā)生變化時,GDB就會自動顯示出n的變化情況。

      9)程序繼續(xù)運行  (gdb) c

      命令"c"(continue)可以使程序繼續(xù)往下運行,直到再次遇到斷點或程序結(jié)束;

      10)退出GDB  (gdb) q

      只需使用指令"q"(quit)即可。

      設(shè)置/刪除斷點

      命令格式                        例子             作用

      break + 設(shè)置斷點的行號  beak n  用于在程序中對應(yīng)行設(shè)置斷點

      tbreak + 行號或函數(shù)名  tbreak n/func  設(shè)置臨時斷點,到達后被自動刪除

      break + filename + 行號  break main.c:10  用于在指定文件對應(yīng)行設(shè)置斷點

      break + <0x...>  break 0x3400a  用于在內(nèi)存某一位置處暫停

      break + 行號 + if + 條件  break 10 if i==3  用于設(shè)置條件斷點,在循環(huán)中使用非常方便

      info breakpoints/watchpoints [n]  info break  n表示斷點號,查看斷點/觀察點的情況

      clear + 要清除的斷點行號  clear 10  用于清除對應(yīng)行的斷點,要給出斷點的行號,清除時GDB會給出提示

      delete + 要清除的斷點編號  delete 3  用于清除斷點和自動顯示的表達式的命令,要給出斷點的編號,清除時GDB不會給出任何提示

      disable/enable + 斷點編號  disable 3  讓所設(shè)斷點暫時失效/使能,如果要讓多個編號處的斷點失效/使能,可將編號之間用空格隔開

      awatch/watch + 變量  awatch/watch i  設(shè)置一個觀察點,當變量被讀出或?qū)懭霑r程序被暫停

      rwatch + 變量  rwatch i  設(shè)置一個觀察點,當變量被讀出時,程序被暫停

      catch      設(shè)置捕捉點來補捉程序運行時的一些事件。如:載入共享庫(動態(tài)鏈接庫)或是C++的異常

      tcatch      只設(shè)置一次捕捉點,當程序停住以后,應(yīng)點被自動刪除

      斷點與觀察點的區(qū)別:

      1.所有使用與breakpoint的操作都適用于watchpoint

      2.斷點是CPU到某一地址取指令時中斷,觀察點是CPU到某一地址讀寫數(shù)據(jù)時中斷。

      在多線程的程序中,觀察點的作用很有限,GDB只能觀察一個線程中的表達式的值,如果用戶確信表達式只被當前線程所存取,那么使用觀察點才有效,GDB無法檢測一個非當前線程對表達式值的改變。

      數(shù)據(jù)相關(guān)命令

      display +表達式  display a  用于顯示表達式的值,每當程序運行到斷點處都會顯示表達式的值

      info display      用于顯示當前所有要顯示值的表達式的情況

      delete + display 編號  delete 3  用于刪除一個要顯示值的表達式,被刪除的表達式將不被顯示

      disable/enable + display 編號  disable/enable 3  使一個要顯示值的表達式暫時失效/使能

       undisplay + display 編號  undisplay 3  用于結(jié)束某個表達式值的顯示

      whatis + 變量  whatis i  顯示某個表達式的數(shù)據(jù)類型

      print(p) + 變量/表達式  p n  用于打印變量或表達式的值

      set + 變量 = 變量值  set i = 3  改變程序中某個變量的值

       在使用print命令時,可以對變量按指定格式進行輸出,其命令格式為print /變量名 + 格式

      其中常用的變量格式:x:十六進制;d:十進制;u:無符號數(shù);o:八進制;c:字符格式;f:浮點數(shù)。

      調(diào)試運行環(huán)境相關(guān)命令

      set args  set args arg1 arg2  設(shè)置運行參數(shù)

      show args  show args  參看運行參數(shù)

      set width + 數(shù)目  set width 70  設(shè)置GDB的行寬

      cd + 工作目錄  cd ../  切換工作目錄

      run  r/run  程序開始執(zhí)行

      step(s)  s  進入式(會進入到所調(diào)用的子函數(shù)中)單步執(zhí)行,進入函數(shù)的前提是,此函數(shù)被編譯有debug信息

      next(n)  n  非進入式(不會進入到所調(diào)用的子函數(shù)中)單步執(zhí)行

      finish  finish  一直運行到函數(shù)返回并打印函數(shù)返回時的堆棧地址和返回值及參數(shù)值等信息

      until + 行數(shù)  u 3  運行到函數(shù)某一行

      continue(c)  c  執(zhí)行到下一個斷點或程序結(jié)束

      return <返回值>  return 5  改變程序流程,直接結(jié)束當前函數(shù),并將指定值返回

      call + 函數(shù)  call func  在當前位置執(zhí)行所要運行的函數(shù)

      堆棧相關(guān)命令

      backtrace/bt  bt  用來打印棧幀指針,也可以在該命令后加上要打印的棧幀指針的個數(shù),查看程序執(zhí)行到此時,是經(jīng)過哪些函數(shù)呼叫的程序,程序“調(diào)用堆棧”是當前函數(shù)之前的所有已調(diào)用函數(shù)的列表(包括當前函數(shù))。每個函數(shù)及其變量都被分配了一個“幀”,最近調(diào)用的函數(shù)在 0 號幀中(“底部”幀)

      frame  frame 1  用于打印指定棧幀

      info reg  info reg  查看寄存器使用情況

      info stack  info stack  查看堆棧使用情況

      up/down  up/down  跳到上一層/下一層函數(shù)

      跳轉(zhuǎn)執(zhí)行
      一般來說,被調(diào)試程序會按照程序代碼的運行順序依次執(zhí)行。GDB提供了亂序執(zhí)行的功能,
      也就是說,GDB可以修改程序的執(zhí)行順序,可以讓程序執(zhí)行隨意跳躍。這個功能可以由GDB
      的jump命令來完:
      jump

      指定下一條語句的運行點。可以是文件的行號,可以是file:line格式,可以是+num這種偏
      移量格式。表式著下一條運行語句從哪里開始。
      jump
      這里的
      是代碼行的內(nèi)存地址。
      注意,jump命令不會改變當前的程序棧中的內(nèi)容,所以,當你從一個函數(shù)跳到另一個函數(shù)
      時,當函數(shù)運行完返回時進行彈棧操作時必然會發(fā)生錯誤,可能結(jié)果還是非常奇怪的,甚至
      于產(chǎn)生程序Core Dump。所以最好是同一個函數(shù)中進行跳轉(zhuǎn)。
      熟悉匯編的人都知道,程序運行時,有一個寄存器用于保存當前代碼所在的內(nèi)存地址。所以,
      jump命令也就是改變了這個寄存器中的值。于是,你可以使用“set $pc”來更改跳轉(zhuǎn)執(zhí)行
      的地址。如:
      set $pc = 0x485

      signal命令

      信號是一種軟中斷,是一種處理異步事件的方法,使用singal命令,可以產(chǎn)生一個信號量給被調(diào)試程序,如中斷信號"Ctrl+C"。這非常方便于程序的調(diào)試,可以在程序運行的任意位置設(shè)置斷點,并在該斷點用GDB產(chǎn)生一個信號量,這種精確地在某處產(chǎn)生信號的方法非常有利于程序的調(diào)試,signal命令語法是:signal <signal>,UNIX的系統(tǒng)信號量通常從1到15,所以<signal>取值也在這個范圍。

      handle
      在GDB中定義一個信號處理。信號可以以SIG開頭或不以SIG開頭,可以用定義一個要處理信號的范圍(如:SIGIO-SIGKILL,表示處理從SIGIO信號到SIGKILL的信號,其中包括SIGIO,SIGIOT,SIGKILL三個信號),也可以使用關(guān)鍵字all來標明要處理所有的信號。一旦被調(diào)試的程序接收到信號,運行程序馬上會被GDB停住,以供調(diào)試。其可以是以下幾種關(guān)鍵字的一個或多個。
      nostop/stop
      當被調(diào)試的程序收到信號時,GDB不會停住程序的運行,但會打出消息告訴你收到這種信號/GDB會停住你的程序 
      print/noprint
      當被調(diào)試的程序收到信號時,GDB會顯示出一條信息/GDB不會告訴你收到信號的信息 
      pass
      noignore
      當被調(diào)試的程序收到信號時,GDB不處理信號。這表示,GDB會把這個信號交給被調(diào)試程序會處理。
      nopass
      ignore
      當被調(diào)試的程序收到信號時,GDB不會讓被調(diào)試程序來處理這個信號。
      info signals
      info handle
      可以查看哪些信號被GDB處理,并且可以看到缺省的處理方式

      single命令和shell的kill命令不同,系統(tǒng)的kill命令發(fā)信號給被調(diào)試程序時,是由GDB截獲的,而single命令所發(fā)出一信號則是直接發(fā)給被調(diào)試程序的。

      GDB中運行UNIX的shell程序

      在gdb環(huán)境中,你可以執(zhí)行UNIX的shell的命令,使用gdb的shell命令來完成: shell
      調(diào)用UNIX的shell來執(zhí)行,環(huán)境變量SHELL中定義的UNIX的shell將會被執(zhí)行,如果SHELL沒有定義,那就使用UNIX的標準shell:/bin/sh。(在Windows中使用Command.com或cmd.exe) 
      make
      可以在gdb中執(zhí)行make命令來重新build自己的程序。這個命令等價于"shell make"


      在GDB中運行程序

      當以gdb 方式啟動gdb后,gdb會在PATH路徑和當前目錄中搜索的源文件。如要確認gdb是否讀到源文件,可使用l或list命令,看看gdb是否能列出源代碼。
      在gdb中,運行程序使用r或是run命令。
      1、程序運行參數(shù)。
      set args 可指定運行時參數(shù)。(如:set args 10 20 30 40 50)
      show args 命令可以查看設(shè)置好的運行參數(shù)。
      2、運行環(huán)境。
      path
      可設(shè)定程序的運行路徑。
      show paths 查看程序的運行路徑。

      set environment varname [=value] 設(shè)置環(huán)境變量。如:set env USER=hchen
      show environment [varname] 查看環(huán)境變量。
      3、工作目錄。
      cd
      相當于shell的cd命令。
      pwd 顯示當前的所在目錄。
      4、程序的輸入輸出。
      info terminal 顯示你程序用到的終端的模式。
      使用重定向控制程序輸出。如:run > outfile
      tty命令可以指寫輸入輸出的終端設(shè)備。如:tty /dev/ttyb

      調(diào)試已運行的程序

      兩種方法:
      1、在UNIX下用ps查看正在運行的程序的PID(進程ID),然后用gdb PID格式掛接正在運行的程序。
      2、先用gdb 關(guān)聯(lián)上源代碼,并進行g(shù)db,在gdb中用attach命令來掛接進程的PID。并用detach來取消掛接的進程。

      暫停 / 恢復程序運行

      當進程被gdb停住時,你可以使用info program 來查看程序的是否在運行,進程號,被暫停的原因。
      在gdb中,我們可以有以下幾種暫停方式:斷點(BreakPoint)、觀察點(WatchPoint)、捕捉點(CatchPoint)、信號(Signals)、線程停止(Thread Stops),如果要恢復程序運行,可以使用c或是continue命令。

      線程(Thread Stops)

      如果程序是多線程,可以定義斷點是否在所有的線程上,或是在某個特定的線程。
      break thread
      break thread if ...
      linespec指定了斷點設(shè)置在的源程序的行號。threadno指定了線程的ID,注意,這個ID是GDB分配的,可以通過“info threads”命令來查看正在運行程序中的線程信息。如果不指定thread 則表示斷點設(shè)在所有線程上面。還可以為某線程指定斷點條件。如:
      (gdb) break frik.c:13 thread 28 if bartab > lim
      當你的程序被GDB停住時,所有的運行線程都會被停住。這方便查看運行程序的總體情況。而在你恢復程序運行時,所有的線程也會被恢復運行。

      調(diào)試core文件

      Linux環(huán)境下經(jīng)常遇到某個進程掛掉而找不到原因,應(yīng)用程序崩潰,可以通過生成core file文件加上gdb來定位

      Core Dump:Core的意思是內(nèi)存,Dump的意思是扔出來,堆出來。開發(fā)和使用Unix程序時,有時程序莫名其妙的down了,卻沒有任何的提示(有時候會提示core dumped),這時候可以查看一下有沒有形如core.進程號的文件生成,這個文件便是操作系統(tǒng)把程序down掉時的內(nèi)存內(nèi)容扔出來生成的, 它可以做為調(diào)試程序的參考

      生成Core文件

      一般默認情況下,core file的大小被設(shè)置為了0,這樣系統(tǒng)就不dump出core file了。

      #設(shè)置core大小為無限
      ulimit -c unlimited
      #設(shè)置文件大小為無限
      ulimit unlimited

      這些需要有root權(quán)限, 在ubuntu下每次重新打開中斷都需要重新輸入上面的第一條命令, 來設(shè)置core大小為無限

      core文件生成路徑:
      輸入可執(zhí)行文件運行命令的同一路徑下。
      若系統(tǒng)生成的core文件不帶其他任何擴展名稱,則全部命名為core。新的core文件生成將覆蓋原來的core文件。

      1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作為擴展。文件內(nèi)容為1,表示添加pid作為擴展名,生成的core文件格式為core.xxxx;為0則表示生成的core文件同一命名為core。
      可通過以下命令修改此文件:
      echo "1" > /proc/sys/kernel/core_uses_pid

      2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
      可通過以下命令修改此文件:
      echo "/corefile/core-%e-%p-%t" > core_pattern,可以將core文件統(tǒng)一生成到/corefile目錄下,產(chǎn)生的文件名為core-命令名-pid-時間戳
      以下是參數(shù)列表:
          %p - insert pid into filename 添加pid
          %u - insert current uid into filename 添加當前uid
          %g - insert current gid into filename 添加當前gid
          %s - insert signal that caused the coredump into the filename 添加導致產(chǎn)生core的信號
          %t - insert UNIX time that the coredump occurred into filename 添加core文件生成時的unix時間
          %h - insert hostname where the coredump happened into filename 添加主機名
          %e - insert coredumping executable name into filename 添加命令名

      用gdb查看core文件

      下面我們可以在發(fā)生運行時信號引起的錯誤時發(fā)生core dump了.
      發(fā)生core dump之后, 用gdb進行查看core文件的內(nèi)容, 以定位文件中引發(fā)core dump的行.
      gdb [exec file] [core file]
      如:
      gdb ./test core

      或gdb ./a.out
       core-file core.xxxx
      gdb后, 用bt命令backtrace或where查看程序運行到哪里, 來定位core dump的文件->行.

      待調(diào)試的可執(zhí)行文件,在編譯的時候需要加-g,core文件才能正常顯示出錯信息

      1)gdb -core=core.xxxx
      file ./a.out
      bt
      2)gdb -c core.xxxx
      file ./a.out
      bt

      用gdb實時觀察某進程crash信息

      啟動進程
      gdb -p PID
      c
      運行進程至crash
      gdb會顯示crash信息
      bt

        相關(guān)評論

        閱讀本文后您有什么感想? 已有人給出評價!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過難過
        • 5 囧
        • 3 圍觀圍觀
        • 2 無聊無聊

        熱門評論

        最新評論

        發(fā)表評論 查看所有評論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字數(shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)
        推薦文章

        沒有數(shù)據(jù)