亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

gdb調試命令

2019-11-10 18:20:00
字體:
來源:轉載
供稿:網友

  本文主要參考自:http://www.cnblogs.com/zzx1045917067/archive/2012/12/26/2834310.html,進行了一點補充和編排;Core dump部分參考了:http://blog.ddup.us/?p=176。

  gdb是一個在UNIX環境下的命令行調試工具。

  如果需要使用gdb調試程序,請在gcc時加上-g選項。

  下面的命令部分是簡化版,比如使用l代替list等等。

 

1.基本命令

1)進入GDB  #gdb test

  test是要調試的程序,由gcc test.c -g -o test生成。進入后提示符變為(gdb) 。

2)查看源碼  (gdb) l

  源碼會進行行號提示。

  如果需要查看在其他文件中定義的函數,在l后加上函數名即可定位到這個函數的定義及查看附近的其他源碼?;蛘撸菏褂脭帱c或單步運行,到某個函數處使用s進入這個函數。

3)設置斷點  (gdb) b 6

  這樣會在運行到源碼第6行時停止,可以查看變量的值、堆棧情況等;這個行號是gdb的行號。

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

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

5)運行代碼  (gdb) r

6)顯示變量值  (gdb) p n

  在程序暫停時,鍵入"p 變量名"(PRint)即可;

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

7)觀察變量  (gdb) watch n

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

8)單步運行  (gdb) n

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

  使程序繼續往下運行,直到再次遇到斷點或程序結束;

10)退出GDB  (gdb) q

 

2.斷點調試

命令格式                        例子                   作用

break + 設置斷點的行號  break n      在n行處設置斷點

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

break + filename + 行號  break main.c:10  用于在指定文件對應行設置斷點

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

break + 行號 + if + 條件  break 10 if i==3   用于設置條件斷點,在循環中使用非常方便 

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

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

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

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

awatch/watch + 變量  awatch/watch i    設置一個觀察點,當變量被讀出或寫入時程序被暫停 

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

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

tcatch                  只設置一次捕捉點,當程序停住以后,應點被自動刪除

 

3.數據命令

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

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

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

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

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

whatis + 變量  whatis i  顯示某個表達式的數據類型

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

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

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

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

 

 

4.調試運行環境相關命令

set args  set args arg1 arg2  設置運行參數

show args  show args  參看運行參數

set width + 數目  set width 70  設置GDB的行寬

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

run  r/run  程序開始執行

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

next(n)  n  非進入式(不會進入到所調用的子函數中)單步執行

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

until + 行數  u 3  運行到函數某一行 

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

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

call + 函數  call func  在當前位置執行所要運行的函數

 

5.堆棧相關命令

backtrace/bt  bt  用來打印棧幀指針,也可以在該命令后加上要打印的棧幀指針的個數,查看程序執行到此時,是經過哪些函數呼叫的程序,程序“調用堆?!笔钱斍昂瘮抵暗乃幸颜{用函數的列表(包括當前函數)。每個函數及其變量都被分配了一個“幀”,最近調用的函數在 0 號幀中(“底部”幀)

frame  frame 1  用于打印指定棧幀

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

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

up/down  up/down  跳到上一層/下一層函數

 

6.跳轉執行

jump  指定下一條語句的運行點。可以是文件的行號,可以是file:line格式,可以是+num這種偏移量格式。表式著下一條運行語句從哪里開始。相當于改變了PC寄存器內容,堆棧內容并沒有改變,跨函數跳轉容易發生錯誤。

 

7.信號命令

signal   signal SIGXXX   產生XXX信號,如SIGINT。一種速查linux查詢信號的方法:# kill -l

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

  single命令和shell的kill命令不同,系統的kill命令發信號給被調試程序時,是由GDB截獲的,而single命令所發出一信號則是直接發給被調試程序的。

 

8.運行Shell命令

  如(gdb)shell ls來運行ls?! ?/p>

 

9.更多程序運行選項和調試

1、程序運行參數。   set args 可指定運行時參數。(如:set args 10 20 30 40 50)   show args 命令可以查看設置好的運行參數。 2、運行環境。   path 可設定程序的運行路徑。   show paths 查看程序的運行路徑。

  set environment varname [=value] 設置環境變量。如:set env USER=hchen 

  show environment [varname] 查看環境變量。 

3、工作目錄。

  cd    相當于shell的cd命令。 

  pwd  顯示當前的所在目錄。 4、程序的輸入輸出。   info terminal 顯示你程序用到的終端的模式。   使用重定向控制程序輸出。如:run > outfile   tty命令可以指寫輸入輸出的終端設備。如:tty /dev/ttyb

5、調試已運行的程序

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

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

7、線程(Thread Stops)

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

 

10.調試core文件

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

(1)生成Core文件

  一般默認情況下,core file的大小被設置為了0,這樣系統就不dump出core file了。修改后才能生成core文件。

  #設置core大小為無限  ulimit -c unlimited  #設置文件大小為無限  ulimit unlimited  這些需要有root權限, 在Ubuntu下每次重新打開中斷都需要重新輸入上面的第一條命令, 來設置core大小為無限

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

1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作為擴展。文件內容為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文件統一生成到/corefile目錄下,產生的文件名為core-命令名-pid-時間戳以下是參數列表:    %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 添加導致產生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 添加命令名

(2)用gdb查看core文件

  發生core dump之后, 用gdb進行查看core文件的內容, 以定位文件中引發core dump的行.  gdb [exec file] [core file]  如:  gdb ./test core

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

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

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

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91理论片午午论夜理片久久| 亚洲国产精品热久久| 中文字幕日韩精品有码视频| 97热精品视频官网| 欧美日韩国产va另类| 色综合色综合久久综合频道88| 久久久在线免费观看| xvideos国产精品| 伊人精品在线观看| 久久精品男人天堂| 欧美成人免费全部观看天天性色| 欧美性视频在线| 精品视频偷偷看在线观看| 欧美性xxxxxxx| 久久亚洲国产精品成人av秋霞| 夜夜嗨av色综合久久久综合网| 国产欧美日韩中文| 北条麻妃在线一区二区| 欲色天天网综合久久| 中文字幕精品一区二区精品| 久久久久国产精品www| 国a精品视频大全| 国产精品爽黄69天堂a| 欧美在线视频一区二区| 国产欧美精品在线播放| 疯狂做受xxxx高潮欧美日本| 国产啪精品视频网站| 国产精品免费小视频| 亚洲春色另类小说| 欧美人与性动交a欧美精品| 亚洲free性xxxx护士hd| 日本高清久久天堂| 国产欧美一区二区三区视频| 欧美日韩激情美女| 国产精品高精视频免费| 91精品国产电影| 少妇精69xxtheporn| 久久久久久久久久久网站| 成人午夜两性视频| 狠狠色狠狠色综合日日小说| 亚洲免费影视第一页| 亚洲成人1234| 亚洲成人性视频| 精品久久久久久久久久久久久| 亚洲黄页网在线观看| 亚洲电影第1页| 久久精品久久精品亚洲人| 亚洲精品久久久久中文字幕欢迎你| 亚洲天堂一区二区三区| 国产在线观看91精品一区| 欧美在线视频网| 亚洲一级免费视频| 精品一区二区三区四区| 国产精品高清在线观看| 精品女厕一区二区三区| 亚洲91精品在线观看| 中文字幕国产亚洲2019| 日韩欧美国产骚| 2019中文在线观看| 久久久久久欧美| 国产精品第一页在线| 亚洲综合最新在线| 亚洲一区二区三区四区视频| 欧美高清理论片| 亚洲色在线视频| 亚洲国产欧美一区二区三区久久| 91chinesevideo永久地址| 久久色在线播放| 在线看国产精品| 97成人精品视频在线观看| 国产91在线视频| 欧美日韩一区二区免费视频| 91免费在线视频| 亚洲最大的av网站| 国内精品久久久| 国产一区视频在线播放| 欧美日韩国产va另类| 亚洲色无码播放| 成人精品一区二区三区电影免费| 国产精品久久精品| 亚洲aⅴ日韩av电影在线观看| 人人爽久久涩噜噜噜网站| 亚洲国产精品成人va在线观看| 国产精品日韩在线一区| 亚洲美女性生活视频| 日韩有码在线观看| 神马久久久久久| 久久久久成人精品| 欧美精品成人在线| 国产精品成人观看视频国产奇米| 欧美日韩精品在线| 久久免费福利视频| 日韩经典中文字幕| 国产精品亚洲一区二区三区| 亚洲影院色无极综合| 欧美裸身视频免费观看| 欧美激情va永久在线播放| 疯狂做受xxxx欧美肥白少妇| 成人中文字幕在线观看| 狠狠躁夜夜躁人人爽天天天天97| 中国日韩欧美久久久久久久久| 亚洲第一精品久久忘忧草社区| 伦理中文字幕亚洲| 中文字幕免费精品一区高清| 成人性生交大片免费看视频直播| 国产午夜精品理论片a级探花| 欧美疯狂性受xxxxx另类| 精品一区精品二区| 中文字幕在线视频日韩| 日韩美女免费观看| 国产日韩av高清| 国产精品极品美女在线观看免费| 久久免费视频在线观看| 精品国产乱码久久久久酒店| 中文字幕欧美国内| 国产亚洲精品激情久久| 97久久超碰福利国产精品…| 日韩精品福利在线| 91精品国产综合久久久久久久久| 欧美精品电影免费在线观看| 日韩亚洲欧美中文在线| 精品免费在线观看| 国产精品第二页| xxx成人少妇69| 精品欧美aⅴ在线网站| 午夜剧场成人观在线视频免费观看| 91久久久久久久一区二区| 欧美丰满少妇xxxxx| 日本久久久久久久| 国产一区二区三区三区在线观看| 亚洲肉体裸体xxxx137| 国色天香2019中文字幕在线观看| 亚洲综合精品一区二区| 亚洲精品久久在线| 日本久久亚洲电影| 亚洲精品美女在线观看| 久久欧美在线电影| 亚洲欧美日韩精品久久奇米色影视| 欧美视频一区二区三区…| 日本aⅴ大伊香蕉精品视频| 精品久久中文字幕| 91沈先生作品| 一本色道久久综合狠狠躁篇怎么玩| 精品国模在线视频| 在线成人激情黄色| 国产成人精品久久亚洲高清不卡| 成人免费看吃奶视频网站| 国产精品免费久久久久久| 国产一区二区日韩精品欧美精品| 国产99视频精品免视看7| 91精品国产免费久久久久久| 欧美国产乱视频| 国产精品一区久久久| 一本大道久久加勒比香蕉| 国产精品久久久久久亚洲影视| 国产精品亚洲аv天堂网| 91精品久久久久久久久久入口| 91在线观看免费| 97超级碰碰人国产在线观看| 91高清免费视频| 在线性视频日韩欧美| 亚洲性69xxxbbb| 2021久久精品国产99国产精品| 成人久久久久久|