欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
程序員情感ORG: 信息“gdb(gcc 的debug 工具
【 原文由 System_Killer@bbs.ustc.edu.cn 所發(fā)表 】 
his is Info file ./gdb.info, produced by Makeinfo-1.63 from the input 
file gdb.texinfo. 
 
START-INFO-DIR-ENTRY 
* Gdb: (gdb).                     The GNU debugger. 
END-INFO-DIR-ENTRY 
   This file documents the GNU debugger GDB. 
 
   This is Edition 4.12, January 1994, of `Debugging with GDB: the GNU 
Source-Level Debugger" for GDB Version 4.16. 
 
   Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995 Free 
Software Foundation, Inc. 
 
   Permission is granted to make and distribute verbatim copies of this 
manual provided the copyright notice and this permission notice are 
preserved on all copies. 
 
   Permission is granted to copy and distribute modified versions of 
this manual under the conditions for verbatim copying, provided also 
that the entire resulting derived work is distributed under the terms 
of a permission notice identical to this one. 
 
   Permission is granted to copy and distribute translations of this 
manual into another language, under the above conditions for modified 
versions. 
 
使用GDB: 
   本文描述GDB,GNU的原代碼調試器。(這是4.12版1994年一月,GDB版本4。16) 
* 目錄: 
* 摘要:                        GDB的摘要 
* 實(shí)例:                          一個(gè)使用實(shí)例 
* 入門(mén):                        進(jìn)入和退出GDB   
* 命令:                        GDB 的命令 
* 運行:                        在GDB下運行程序 
* 停止:                        暫停和繼續執行 
* 棧:                          檢查堆棧 
* 原文件:                      檢查原文件 
* 數據:                        檢查數據 
* 語(yǔ)言:                        用不同的語(yǔ)言來(lái)使用GDB 
* 符號:                         檢查符號表 
* 更改:                         更改執行 
* GDB的文件                     文件 
* 對象                          指定調試對象 
* 控制GDB                       控制 
* 執行序列:                    執行一序列命令 
* Emacs:                        使GDB和Emacs一起工作 
* GDB的bug: 
* 命令行編輯:                  行編輯 
* 使用歷史記錄交互: 
* 格式化文檔:                  如何格式化和打印GDB文檔 
* 安裝GDB :                   
 
* 索引: 
 
GDB簡(jiǎn)介: 
************** 
 
   調試器(比如象GDB)能讓你觀(guān)察另一個(gè)程序在執行時(shí)的內部活動(dòng),或程序出錯時(shí) 
發(fā)生了什么。 
   GDB主要能為你做四件事(包括為了完成這些事而附加的功能),幫助你找出程序 
中的錯誤。 
   * 運行你的程序,設置所有的能影響程序運行的東西。 
 
   * 保證你的程序在指定的條件下停止。 
 
   * 當你程序停止時(shí),讓你檢查發(fā)生了什么。 
 
   * 改變你的程序。那樣你可以試著(zhù)修正某個(gè)bug引起的問(wèn)題,然后繼續查找另一 
     個(gè)bug. 
 
   你可以用GDB來(lái)調試C和C++寫(xiě)的程序。(參考 *C 和C++) 
 
   部分支持Modula-2和chill,但現在還沒(méi)有這方面的文檔。 
 
   調試Pascal程序時(shí),有一些功能還不能使用。 
 
  GDB還可以用來(lái)調試FORTRAN程序,盡管現在還不支持表達式的輸入,輸出變量, 
或類(lèi)FORTRAN的詞法。 
* GDB是"free software",大家都可以免費拷貝。也可以為GDB增加新的功能,不 
過(guò)可要遵守GNU的許可協(xié)議幺。反正我認為GNU還是比較不錯的:-) 
就這句話(huà): 
   Fundamentally, the General Public License is a license which says 
that you have these freedoms and that you cannot take these freedoms 
away from anyone else. 
GDB的作者: 
   Richard Stallman是GDB的始作俑者,另外還有許多別的GNU的成員。許多人 
為此作出了貢獻。(都是老外不提也罷,但愿他們不要來(lái)找我麻煩:-)) 
 
一個(gè)例子: 
******************** 
 
   當你吃飽了的話(huà),你可以慢慢的把所有的關(guān)于GDB文章看完。(嘻嘻,我好象 
差不多)然而,一些常用的命令足夠讓你開(kāi)始在GDB的世界中探險了。Let"s go! 
   一個(gè)最初的GNU"m4"(一個(gè)普通的宏處理)展示了一些bug:有時(shí)我們會(huì )改變缺省的 
引用串,這個(gè)命令用來(lái)捕捉另一個(gè)嵌套宏定義出問(wèn)題了。 
 
這里是GDB的一個(gè)例子: 
        原文中是使用一個(gè)叫m4的程序。但很遺憾我找不到這個(gè)程序的原代碼, 
所以沒(méi)有辦法來(lái)按照原文來(lái)說(shuō)明。不過(guò)反正是個(gè)例子,我就拿一個(gè)操作系統的 
進(jìn)程調度原碼來(lái)說(shuō)明把,原代碼我會(huì )附在后面。 
        首先這個(gè)程序叫os.c是一個(gè)模擬進(jìn)程調度的原程序(也許是個(gè)老古董了:-))。 
先說(shuō)明一下如何取得包括原代碼符號的可執行代碼。大家有心的話(huà)可以去看一下gcc的 
man文件(在shell下打man gcc)。gcc -g <原文件.c> -o <要生成的文件名> 
-g 的意思是生成帶原代碼調試符號的可執行文件。 
-o 的意思是指定可執行文件名。 
(gcc 的命令行參數有一大堆,有興趣可以自己去看看。) 
反正在linux下把os.c用以上方法編譯連接以后就產(chǎn)生了可供gdb使用的可執行文件。 
我用gcc -g os.c -o os,產(chǎn)生的可執行文檔叫os. 
然后打gdb os,就可進(jìn)入gdb,屏幕提示: 
     GDB is free software and you are welcome to distribute copies 
      of it under certain conditions; type "show copying" to see 
      the conditions. 
     There is absolutely no warranty for GDB; type "show warranty" 
      for details. 
       
     GDB 4.16, Copyright 1995 Free Software Foundation, Inc... 
 (gdb) 
  (gdb)是提示符,在這提示符下可以輸入命令,直到退出。(退出命令是q/Q) 
為了盡量和原文檔說(shuō)明的命令相符,即使在本例子中沒(méi)用的命令我也將演示。 
首先我們可以設置gdb的屏幕大小。鍵入: 
 (gdb)set width 70 
就是把標準屏幕設為70列。 
  然后讓我們來(lái)設置斷點(diǎn)。設置方法很簡(jiǎn)單:break或簡(jiǎn)單打b后面加行號或函數名 
比如我們可以在main 函數上設斷點(diǎn): 
 (gdb)break main 
或(gdb)b main 
 系統提示:Breakpoint 1 at 0x8049552: file os.c, line 455. 
 然后我們可以運行這個(gè)程序,當程序運行到main函數時(shí)程序就會(huì )停止返回到gdb的 
提示符下。運行的命令是run或r(gdb中有不少alias,可以看一下help,在gdb下打help) 
run 后面可以跟參數,就是為程序指定命令行參數。 
比如r abcd,則程序就會(huì )abcd以作為參數。(這里要說(shuō)明的是可以用set args來(lái)指定參 
數)。打入r或run后,程序就開(kāi)始運行直到進(jìn)入main的入口停止,顯示: 
Starting program: <路徑>/os 
 
Breakpoint 1, main () at os.c:455 
455            Initial(); 
這里455 Initial();是將要執行的命令或函數。 
gdb提供兩種方式:1.單步進(jìn)入,step into就是跟蹤到函數內啦。命令是step或s 
                 2.單步,next,就是簡(jiǎn)單的單步,不會(huì )進(jìn)入函數。命令是next或n 
這兩個(gè)命令還有別的用法以后再說(shuō)。 
我們用n命令,鍵入: 
(gdb)n 
Success forking process# 1 ,pid is 31474 
 
Success forking process# 2 ,pid is 31475 
 
Success forking process# 3 ,pid is 31476 
 
Success forking process# 4 ,pid is 31477 
 
Success forking process# 5 ,pid is 31478 
 
Success forking process# 6 ,pid is 31479 
 
                Dispatching Algorithm : FIFO 
******************************************************************************** 
            PCB#        PID     Priority        PC      State 
            1           31474      24            0      WAITING 
            2           31475      19            0      WAITING 
            3           31476      16            0      WAITING 
            4           31477      23            0      WAITING 
            5           31478      22            0      WAITING 
            6           31479      20            0      WAITING 
 
****************************************************************************** 
 
CPU  :  NO process running 
IO :  No process 
Waiting CPU!!!  31474   31475   31476   31477   31478   31479 
Waiting  IO    NONE 
456            State=WAITING; 
最后的一行就是下一句要執行的命令。我們現在在另一個(gè)函數上加斷點(diǎn)。注意我們 
可以用l/list命令來(lái)顯示原代碼。這里我們鍵入 
(gdb)l 
451     main() 
452     { 
453             int message; 
454 
455            Initial(); 
456            State=WAITING; 
457            printf("Use Control-C to halt \n"); 
458            signal(SIGALRM,AlarmMessage); 
459            signal(SIGINT,InteruptMessage); 
460            signal(SIGUSR2,IoMessage); 
(gdb) l 
461            alarm(TimeSlot); 
462            for(;;) 
463             { 
464             message=GetMessage(); 
465                   switch(message) 
466                     { 
467                             case INTERRUPT :        printf("Use Control-C t; 
468                                                     break; 
469                             case CHILD_IO:          WaitingIo(); 
470                                                     break; 
顯示了原代碼,現在在A(yíng)larmMessage上加斷點(diǎn)。 
(gdb) b AlarmMessage 
Breakpoint 2 at 0x8048ee3: file os.c, line 259. 
(gdb) 
然后我們繼續運行程序。 
(gdb)c 
c或continue命令讓我們繼續被中斷的程序。 顯示: 
Continuing. 
Use Control-C to halt 
 
Breakpoint 2, AlarmMessage () at os.c:259 
259             ClearSignal(); 
注意我們下一句語(yǔ)句就是ClearSignal(); 
我們用s/step跟蹤進(jìn)入這個(gè)函數看看它是干什么的。 
(gdb) s 
ClearSignal () at os.c:227 
227             signal(SIGINT,SIG_IGN); 
用l命令列出原代碼: 
(gdb) l 
222     } 
223 
224 
225     void ClearSignal()    /* Clear other signals */ 
226     { 
227             signal(SIGINT,SIG_IGN); 
228             signal(SIGALRM,SIG_IGN); 
229             signal(SIGUSR2,SIG_IGN); 
230     } 
231 
(gdb) 
我們可以用s命令繼續跟蹤?,F在讓我們來(lái)試試bt或backtrace命令。這個(gè)命令可以 
顯示棧中的內容。 
(gdb) bt 
#0  ClearSignal () at os.c:227 
#1  0x8048ee8 in AlarmMessage () at os.c:259 
#2  0xbffffaec in ?? () 
#3  0x80486ae in ___crt_dummy__ () 
(gdb) 
大家一定能看懂顯示的意思。棧頂是AlarmMessage,接下來(lái)的函數沒(méi)有名字--就是 
沒(méi)有原代碼符號。這顯示了函數調用的嵌套。 
好了,我們跟蹤了半天還沒(méi)有檢查過(guò)變量的值呢。檢查表達式的值的命令是p或print 
格式是p <表達式> 
讓我們來(lái)找一個(gè)變量來(lái)看看。:-) 
(gdb)l 1 
還記得l的作用嗎?l或list顯示原代碼符號,l或list加<行號>就顯示從<行號>開(kāi)始的 
原代碼。好了找到一個(gè)讓我們來(lái)看看WaitingQueue的內容 
(gdb) p WaitingQueue 
$1 = {1, 2, 3, 4, 5, 6, 0} 
(gdb) 
WaitingQueue是一個(gè)數組,gdb還支持結構的顯示, 
(gdb) p Pcb 
$2 = {{Pid = 0, State = 0, Prior = 0, pc = 0}, {Pid = 31474, State = 2, 
    Prior = 24, pc = 0}, {Pid = 31475, State = 2, Prior = 19, pc = 0}, { 
    Pid = 31476, State = 2, Prior = 16, pc = 0}, {Pid = 31477, State = 2, 
    Prior = 23, pc = 0}, {Pid = 31478, State = 2, Prior = 22, pc = 0}, { 
    Pid = 31479, State = 2, Prior = 20, pc = 0}} 
(gdb) 
這里可以對照原程序看看。 
原文檔里是一個(gè)調試過(guò)程,不過(guò)我想這里我已經(jīng)把gdb的常用功能介紹了一遍,基本上可以用來(lái)調試程序了。:-)   
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
fork 函數詳解
GDB框架過(guò)程概述
Linux下GNU調試器gdb詳細說(shuō)明
Linux下的C編程實(shí)戰之開(kāi)發(fā)平臺搭建 - 天極網(wǎng)
掌握GDB調試工具,輕松排除bug
minGW的gdb調試
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久