日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

C gdb调试工具

發(fā)布時(shí)間:2023/12/10 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C gdb调试工具 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

編譯程序
cc -g try.c -o try

一 列文件清單
  List
  (gdb) list line1,line2
[編輯本段]

二:執(zhí)行程序
  要想運(yùn)行準(zhǔn)備調(diào)試的程序,可使用run命令,在它后面可以跟隨發(fā)給該程序的任何參數(shù),包括標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出說明符(<和> )和shell通配符(*、?、[、])在內(nèi)。如果你使用不帶參數(shù)的run命令,gdb就再次使用你給予前一條run命令的參數(shù),這是很有用的。利用set args 命令就可以修改發(fā)送給程序的參數(shù),而使用show args 命令就可以查看其缺省參數(shù)的列表。
  (gdb)set args –b –x
  (gdb) show args
  backtrace命令為堆棧提供向后跟蹤功能。
  Backtrace 命令產(chǎn)生一張列表,包含著從最近的過程開始的所有有效過程和調(diào)用這些過程的參數(shù)。

三:顯示數(shù)據(jù)
  利用print 命令可以檢查各個(gè)變量的值。
  (gdb) print p (p為變量名)
  print 是gdb的一個(gè)功能很強(qiáng)的命令,利用它可以顯示被調(diào)試的語言中任何有效的表達(dá)式。表達(dá)式除了包含你程序中的變量外,還可以包含以下內(nèi)容:
  對程序中函數(shù)的調(diào)用
  (gdb) print find_entry(1,0)
  數(shù)據(jù)結(jié)構(gòu)和其他復(fù)雜對象
  (gdb) print *table_start
  ={e=reference=’\000’,location=0x0,next=0x0}
  值的歷史成分
  (gdb)print (為歷史記錄變量,在以后可以直接引用的值)
  人為數(shù)組
  人為數(shù)組提供了一種去顯示存儲(chǔ)器塊(數(shù)組節(jié)或動(dòng)態(tài)分配的存儲(chǔ)區(qū))內(nèi)容的方法。早期的調(diào)試程序沒有很好的方法將任意的指針換成一個(gè)數(shù)組。就像對待參數(shù)一樣,讓我們查看內(nèi)存中在變量h后面的10個(gè)整數(shù),一個(gè)動(dòng)態(tài)數(shù)組的語法如下所示:
  base@length
  因此,要想顯示在h后面的10個(gè)元素,可以使用h@10:
  (gdb)print h@10
  =(-1,345,23,-234,0,0,0,98,345,10)
  whatis 命令可以顯示某個(gè)變量的類型
  (gdb) whatis p
  type = int *

四:斷點(diǎn)(breakpoint)
  break命令(可以簡寫為b)可以用來在調(diào)試的程序中設(shè)置斷點(diǎn),該命令有如下四種形式:
  break line-number 使程序恰好在執(zhí)行給定行之前停止。
  break function-name 使程序恰好在進(jìn)入指定的函數(shù)之前停止。
  break line-or-function if condition 如果condition(條件)是真,程序到達(dá)指定行或函數(shù)時(shí)停止。
  break routine-name 在指定例程的入口處設(shè)置斷點(diǎn)
  如果該程序是由很多原文件構(gòu)成的,你可以在各個(gè)原文件中設(shè)置斷點(diǎn),而不是在當(dāng)前的原文件中設(shè)置斷點(diǎn),其方法如下:
  (gdb) break filename:line-number
  (gdb) break filename:function-name
  要想設(shè)置一個(gè)條件斷點(diǎn),可以利用break if命令,如下所示:
  (gdb) break line-or-function if expr
  例:
  (gdb) break 46 if testsize==100
  從斷點(diǎn)繼續(xù)運(yùn)行:countinue 命令

五.斷點(diǎn)的管理
  1.顯示當(dāng)前gdb的斷點(diǎn)信息:
  (gdb) info break
  他會(huì)以如下的形式顯示所有的斷點(diǎn)信息:
  Num Type Disp Enb Address What
  1 breakpoint keep y 0x000028bc in init_random at qsort2.c:155
  2 breakpoint keep y 0x0000291c in init_organ at qsort2.c:168
  刪除指定的某個(gè)斷點(diǎn):
  (gdb) delete breakpoint 1
  該命令將會(huì)刪除編號(hào)為1的斷點(diǎn),如果不帶編號(hào)參數(shù),將刪除所有的斷點(diǎn)
  (gdb) delete breakpoint
  禁止使用某個(gè)斷點(diǎn)
  (gdb) disable breakpoint 1
  該命令將禁止斷點(diǎn) 1,同時(shí)斷點(diǎn)信息的 (Enb)域?qū)⒆優(yōu)?n
  允許使用某個(gè)斷點(diǎn)
  (gdb) enable breakpoint 1
  該命令將允許斷點(diǎn) 1,同時(shí)斷點(diǎn)信息的 (Enb)域?qū)⒆優(yōu)?y
  清除原文件中某一代碼行上的所有斷點(diǎn)
  (gdb)clean number
  注:number 為原文件的某個(gè)代碼行的行號(hào)

六.變量的檢查和賦值
  whatis:識(shí)別數(shù)組或變量的類型
  ptype:比whatis的功能更強(qiáng),他可以提供一個(gè)結(jié)構(gòu)的定義
  set variable:將值賦予變量
  print 除了顯示一個(gè)變量的值外,還可以用來賦值

七. 單步執(zhí)行
  next 不進(jìn)入的單步執(zhí)行
  step 進(jìn)入的單步執(zhí)行如果已經(jīng)進(jìn)入了某函數(shù),而想退出該函數(shù)返回到它的調(diào)用函數(shù)中,可使用命令finish

八.函數(shù)的調(diào)用
  call name 調(diào)用和執(zhí)行一個(gè)函數(shù)
  (gdb) call gen_and_sork( 1234,1,0 )
  (gdb) call printf(“abcd”)
  =4
  finish 結(jié)束執(zhí)行當(dāng)前函數(shù),顯示其返回值(如果有的話)

九.機(jī)器語言工具
  有一組專用的gdb變量可以用來檢查和修改計(jì)算機(jī)的通用寄存器,gdb提供了目前每一臺(tái)計(jì)算機(jī)中實(shí)際使用的4個(gè)寄存器的標(biāo)準(zhǔn)名字:
  $pc : 程序計(jì)數(shù)器
  $fp : 幀指針(當(dāng)前堆棧幀)
  $sp : 棧指針
  $ps : 處理器狀態(tài)

十.信號(hào)
  gdb通常可以捕捉到發(fā)送給它的大多數(shù)信號(hào),通過捕捉信號(hào),它就可決定對于正在運(yùn)行的進(jìn)程要做些什么工作。例如,按CTRL-C將中斷信號(hào)發(fā)送給gdb,通常就會(huì)終止gdb。但是你或許不想中斷gdb,真正的目的是要中斷gdb正在運(yùn)行的程序,因此,gdb要抓住該信號(hào)并停止它正在運(yùn)行的程序,這樣就可以執(zhí)行某些調(diào)試操作。
  Handle命令可控制信號(hào)的處理,他有兩個(gè)參數(shù),一個(gè)是信號(hào)名,另一個(gè)是接受到信號(hào)時(shí)該作什么。幾種可能的參數(shù)是:
  nostop 接收到信號(hào)時(shí),不要將它發(fā)送給程序,也不要停止程序。
  stop 接受到信號(hào)時(shí)停止程序的執(zhí)行,從而允許程序調(diào)試;顯示一條表示已接受到信號(hào)的消息(禁止使用消息除外)
  print 接受到信號(hào)時(shí)顯示一條消息
  noprint 接受到信號(hào)時(shí)不要顯示消息(而且隱含著不停止程序運(yùn)行)
  pass 將信號(hào)發(fā)送給程序,從而允許你的程序去處理它、停止運(yùn)行或采取別的動(dòng)作。
  nopass 停止程序運(yùn)行,但不要將信號(hào)發(fā)送給程序。
  例如,假定你截獲SIGPIPE信號(hào),以防止正在調(diào)試的程序接受到該信號(hào),而且只要該信號(hào)一到達(dá),就要求該程序停止,并通知你。要完成這一任務(wù),可利用如下命令:
  (gdb) handle SIGPIPE stop print
  請注意,UNIX的信號(hào)名總是采用大寫字母!你可以用信號(hào)編號(hào)替代信號(hào)名如果你的程序要執(zhí)行任何信號(hào)處理操作,就需要能夠測試其信號(hào)處理程序,為此,就需要一種能將信號(hào)發(fā)送給程序的簡便方法,這就是signal命令的任務(wù)。該命令的參數(shù)是一個(gè)數(shù)字或者一個(gè)名字,如SIGINT。假定你的程序已將一個(gè)專用的SIGINT(鍵盤輸入,或CTRL-C;信號(hào)2)信號(hào)處理程序設(shè)置成采取某個(gè)清理動(dòng)作,要想測試該信號(hào)處理程序,你可以設(shè)置一個(gè)斷點(diǎn)并使用如下命令:
  (gdb) signal 2
  continuing with signal SIGINT(2)
  該程序繼續(xù)執(zhí)行,但是立即傳輸該信號(hào),而且處理程序開始運(yùn)行。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

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

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