青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

elva

[Pthread] Linux程序調試的基石(二)--Inside GDB

3. GDB的實現
GDB是GNU發布的一個強大的程序調試工具,用以調試C/C++程序。可以使程序員在程序運行的時候觀察程序在內存/寄存器中的使用情況。它的實現也是基于ptrace系統調用來完成的。
其 原理是利用ptrace系統調用,在被調試程序和gdb之間建立跟蹤關系。然后所有發送給被調試程序的信號(除SIGKILL)都會被gdb截獲,gdb 根據截獲的信號,查看被調試程序相應的內存地址,并控制被調試的程序繼續運行。GDB常用的使用方法有斷點設置和單步跟蹤,接下來我們來分析一下他們是如 何實現的。

3.1 建立調試關系
用gdb調試程序,可以直接gdb ./test,也可以gdb <pid>(test的進程號)。這對應著使用ptrace建立跟蹤關系的兩種方式:
1)fork: 利用fork+execve執行被測試的程序,子進程在執行execve之前調用ptrace(PTRACE_TRACEME),建立了與父進程(debugger)的跟蹤關系。如我們在分析strace時所示意的程序。
2)attach: debugger可以調用ptrace(PTRACE_ATTACH,pid,...),建立自己與進程號為pid的進程間的跟蹤關系。即利用 PTRACE_ATTACH,使自己變成被調試程序的父進程(用ps可以看到)。用attach建立起來的跟蹤關系,可以調用ptrace (PTRACE_DETACH,pid,...)來解除。注意attach進程時的權限問題,如一個非root權限的進程是不能attach到一個 root進程上的。

3.2 斷點原理
斷點是大家在調試程序時常用的一個功能,如break linenumber,當執行到linenumber那一行的時候被調試程序會停止,等待debugger的進一步操作。
斷點的實現原理,就是在指定的位置插入斷點指令,當被調試的程序運行到斷點的時候,產生SIGTRAP信號。該信號被gdb捕獲并進行斷點命中判定,當gdb判斷出這次SIGTRAP是斷點命中之后就會轉入等待用戶輸入進行下一步處理,否則繼續。
斷點的設置原理: 在程序中設置斷點,就是先將該位置的原來的指令保存,然后向該位置寫入int 3。當執行到int 3的時候,發生軟中斷,內核會給子進程發出SIGTRAP信號,當然這個信號會被轉發給父進程。然后用保存的指令替換int3,等待恢復運行。
斷點命中判定:gdb把所有的斷點位置都存放在一個鏈表中,命中判定即把被調試程序當前停止的位置和鏈表中的斷點位置進行比較,看是斷點產生的信號,還是無關信號。

3.3 單步跟蹤原理
單步跟蹤就是指在調試程序的時候,讓程序運行一條指令/語句后就停下。GDB中常用的命令有next, step, nexti, stepi。單步跟蹤又常分為語句單步(next, step)和指令單步(如nexti, stepi)。

在linux上,指令單步可以通過ptrace來實現。調用ptrace(PTRACE_SINGLESTEP,pid,...)可以使被調試的進程在每執行完一條指令后就觸發一個SIGTRAP信號,讓GDB運行。下面來看一個例子:
    child = fork();
    if(child == 0) {
         execl("./HelloWorld", "HelloWorld", NULL);
    }
    else {
        ptrace(PTRACE_ATTACH,child,NULL,NULL);
        while(1){
        wait(&val);
        if(WIFEXITED(val))
            break;
        count++;
        ptrace(PTRACE_SINGLESTEP,child,NULL,NULL);
        }
    printf("Total Instruction number= %d\n",count);
    }
這 段程序比較簡單,子進程調用execve執行HelloWorld,而父進程則先調用ptrace(PTRACE_ATTACH,pid,...)建立與 子進程的跟蹤關系。然后調用ptrace(PTRACE_SINGLESTEP, pid, ...)讓子進程一步一停,以統計子進程一共執行了多少條指令(你會發現一個簡單的HelloWorld實際上也執行了好幾萬條指令才完成)。當然你也完 全可以在這個時候查看EIP寄存器中存放的指令,或者某個變量的值,當然前提是你得知道這個變量在子進程內存鏡像中的位置。
指令單步可以依靠硬件 完成,如x86架構處理器支持單步模式(通過設置EFLAGS寄存器的TF標志實現),每執行一條指令,就會產生一次異常(在Intel 80386以上的處理器上還提供了DRx調試寄存器以用于軟件調試)。也可以通過軟件完成,即在每條指令后面都插入一條斷點指令,這樣每執行一條指令都會 產生一次軟中斷。
語句單步基于指令單步實現,即GDB算好每條語句所對應的指令,從什么地方開始到什么地方結束。然后在結束的地方插入斷點,或者指令單步一步一步的走到結束點,再進行處理。

當 然gdb的實現遠比今天我們所說的內容要復雜,它能讓我們很容易的監測,修改被調試的進程,比如通過行號,函數名,變量名。而要真正實現這些,一是需要在 編譯的時候提供足夠的信息,如在gcc時加入-g選項,這樣gcc會把一些程序信息放到生成的ELF文件中,包括函數符號表,行號,變量信息,宏定義等, 以便日后gdb調試,當然生成的文件也會大一些。二是需要我們對ELF文件格式,進程的內存鏡像(布局)以及程序的指令碼十分熟悉。這樣才能保證在正確的 時機(斷點發生?單步?)找到正確的內存地址(代碼?數據?)并鏈接回正確的程序代碼(這是哪個變量?程序第幾行?)。感興趣的同學可以找到相應的代碼仔 細分析一下。

小結:
ptrace可以實時監測和修改另一個進程的運行,它是如此的強大以至于曾經因為它在unix-like平臺 (如Linux, *BSD)上產生了各種漏洞。但換言之,只要我們能掌握它的使用,就能開發出很多以前在用戶態下不可能實現的應用。當然這可能需要我們掌握編譯,文件格 式,程序內存布局等相當多的底層知識。

最后讓我們來回顧一下ptrace的使用:
1)用PTRACE_ATTACH或者PTRACE_TRACEME 建立進程間的跟蹤關系。
2)PTRACE_PEEKTEXT, PTRACE_PEEKDATA, PTRACE_PEEKUSR等讀取子進程內存/寄存器中保留的值。
3)PTRACE_POKETEXT, PTRACE_POKEDATA, PTRACE_POKEUSR等把值寫入到被跟蹤進程的內存/寄存器中。
4)用PTRACE_CONT,PTRACE_SYSCALL, PTRACE_SINGLESTEP控制被跟蹤進程以何種方式繼續運行。
5)PTRACE_DETACH, PTRACE_KILL 脫離進程間的跟蹤關系。

TIPS:
    1. 進程狀態TASK_TRACED用以表示當前進程因為被父進程跟蹤而被系統停止。
    2. 如在子進程結束前,父進程結束,則trace關系解除。
    3. 利用attach建立起來的跟蹤關系,雖然ps看到雙方為父子關系,但在"子進程"中調用getppid()仍會返回原來的父進程id。
    4. 不能attach到自己不能跟蹤的進程,如non-root進程跟蹤root進程。
    5. 已經被trace的進程,不能再次被attach。
    6. 即使是用PTRACE_TRACEME建立起來的跟蹤關系,也可以用DETACH的方式予以解除。
    7. 因為進入/退出系統調用都會觸發一次SIGTRAP,所以通常的做法是在第一次(進入)的時候讀取系統調用的參數,在第二次(退出)的時候讀取系統調用的返回值。但注意execve是個例外。
    8. 程序調試時的斷點由int 3設置完成,而單步跟蹤則可由ptrace(PTRACE_SINGLESTEP)實現。
   
Pthread 08/01/14

原文地址:http://blog.csdn.net/Javadino/archive/2008/09/06/2891434.aspx

posted on 2009-07-25 17:56 葉子 閱讀(1485) 評論(0)  編輯 收藏 引用 所屬分類: Unix

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲毛片一区二区| 亚洲婷婷在线| 欧美国产日韩精品| 亚洲精品久久嫩草网站秘色| 亚洲成色最大综合在线| 久久九九国产| 久久精品亚洲精品| 国产精品久久久久久久久免费桃花| 夜夜嗨av一区二区三区| 99精品视频免费| 国产欧美一区二区在线观看| 久久久精品视频成人| 久久久久久穴| 这里只有视频精品| 亚洲永久在线观看| 在线免费观看日本一区| 亚洲国产精品美女| 国产精品久久久久久久午夜片| 亚洲欧美视频一区| 久久久久国产精品一区二区| 亚洲精品字幕| 欧美亚洲在线观看| 日韩亚洲不卡在线| 欧美在线高清| 亚洲私人影吧| 久久久xxx| 一本久道久久综合中文字幕 | 91久久精品国产91久久| 欧美一级一区| 免费成人你懂的| 性色一区二区三区| 老司机成人网| 久久成人资源| 欧美视频官网| 亚洲国产精品一区在线观看不卡| 国产精品欧美激情| 欧美国产免费| 国产一区在线播放| 久久久久久夜精品精品免费| 欧美va天堂在线| 久久av二区| 欧美日韩一区二区精品| 欧美99久久| 国产日韩欧美另类| 一区二区三区黄色| 亚洲六月丁香色婷婷综合久久| 欧美在线一二三四区| 中文成人激情娱乐网| 牛牛国产精品| 免费欧美网站| 伊人久久婷婷| 久久se精品一区二区| 翔田千里一区二区| 国产精品久久久久久久久久久久久久| 亚洲第一区中文99精品| 伊人夜夜躁av伊人久久| 欧美专区日韩专区| 欧美一区三区三区高中清蜜桃| 欧美日韩亚洲综合一区| 亚洲电影av在线| 亚洲黄色毛片| 免费观看成人网| 欧美激情综合| 亚洲高清免费在线| 美国成人直播| 欧美激情亚洲视频| 亚洲精品黄色| 欧美区在线播放| 99re视频这里只有精品| 一区二区精品| 国产精品久久久久毛片大屁完整版| 夜夜爽夜夜爽精品视频| 亚洲视频在线观看一区| 国产精品久久毛片a| 亚洲综合色噜噜狠狠| 久久成人亚洲| 依依成人综合视频| 米奇777在线欧美播放| 亚洲电影激情视频网站| 日韩亚洲欧美综合| 欧美视频一区二区三区| 亚洲一区三区视频在线观看| 久久久999成人| 在线成人性视频| 欧美精品www| 一区二区三区视频在线观看| 欧美一级视频精品观看| 韩国成人精品a∨在线观看| 久久综合伊人77777麻豆| 亚洲国产精品久久91精品| 亚洲网站在线| 一区二区三区在线视频播放| 老色鬼久久亚洲一区二区| 亚洲人成在线播放| 欧美一区二区久久久| 在线观看av不卡| 欧美日韩在线一区二区| 欧美一级片一区| 亚洲国产精品成人综合色在线婷婷| 亚洲婷婷综合久久一本伊一区| 国产日韩亚洲| 欧美精品激情| 欧美在线播放一区二区| 亚洲精品美女免费| 久久男人av资源网站| 日韩一级欧洲| 在线成人国产| 国产精品视频xxxx| 欧美福利电影在线观看| 欧美一级专区| 亚洲美女视频网| 欧美91大片| 久久精品道一区二区三区| 一本色道久久88亚洲综合88| 国产一区二区三区久久精品| 欧美日韩亚洲三区| 老司机精品视频一区二区三区| 亚洲中午字幕| 亚洲精品国精品久久99热| 蜜臀99久久精品久久久久久软件| 亚洲一区二区精品在线| 亚洲激情午夜| 伊人婷婷欧美激情| 国产乱码精品一区二区三区av| 欧美精品九九99久久| 久久久久久久91| 欧美一区二区在线免费播放| 亚洲视频网在线直播| 亚洲国产欧美日韩| 欧美成人免费全部观看天天性色| 久久国内精品视频| 亚洲一区二区三区中文字幕在线| 亚洲黄色在线视频| 狠狠色综合网| 国一区二区在线观看| 国产精品美女| 国产精品系列在线播放| 欧美亚州在线观看| 欧美连裤袜在线视频| 欧美成人精精品一区二区频| 蜜臀va亚洲va欧美va天堂 | 欧美高清视频在线观看| 久久美女性网| 久热精品视频在线免费观看| 久久成人综合视频| 久久国产精品久久久久久| 欧美一区二区黄色| 欧美一区二区高清在线观看| 欧美一区二区视频观看视频| 欧美一区二区精品| 久久九九热re6这里有精品| 久久久午夜电影| 免费中文日韩| 亚洲国产精品悠悠久久琪琪| 亚洲欧洲视频在线| 亚洲毛片在线看| 亚洲影院污污.| 欧美一区二区私人影院日本 | 一本色道久久综合精品竹菊| 99这里有精品| 亚洲免费在线观看视频| 欧美在线观看你懂的| 久久亚洲春色中文字幕| 欧美福利一区二区三区| 欧美日韩一区自拍| 国产女同一区二区 | 欧美不卡激情三级在线观看| 欧美精品播放| 国产精品久久午夜| 激情偷拍久久| 一级日韩一区在线观看| 午夜宅男久久久| 理论片一区二区在线| 欧美高清视频在线| 宅男噜噜噜66一区二区66| 欧美伊人久久| 欧美激情精品久久久六区热门| 国产精品久久久久久久app| 国产在线一区二区三区四区| 亚洲精品免费一区二区三区| 亚洲欧美在线观看| 欧美超级免费视 在线| 99热免费精品| 久久网站热最新地址| 国产精品红桃| 最新日韩在线| 久久不见久久见免费视频1| 91久久精品日日躁夜夜躁欧美| 亚洲自拍啪啪| 欧美精品色综合| 怡红院av一区二区三区| 亚洲一区二区三区午夜| 欧美成人免费视频| 亚洲免费人成在线视频观看| 欧美成人精品激情在线观看 | 欧美激情一区二区三区| 国产精品一区二区视频| 亚洲免费激情| 欧美黄色大片网站| 久久国产日本精品|