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

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

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

開(kāi)通VIP
用GDB調試多進(jìn)程程序

眾所周知,GDB是Unix/Linux下調試程序的龍頭老大,GDB功能強大,我們在平時(shí)多使用其一些最基本的功能,而且一般調試的都是單進(jìn)程的程序。最近一個(gè)項目中的問(wèn)題讓我接觸如何使用GDB調試多進(jìn)程程序,更確切的是說(shuō)調試調用fork的多進(jìn)程程序。

使用GDB最好的文檔就是其名為'Debugging with GDB'的參考手冊。手冊中有一小章節提到了如何調試多進(jìn)程程序。一般情況下,如果被gdb調試的程序中調用fork派生出一個(gè)新的子進(jìn)程,這時(shí)gdb調試的仍然還是父進(jìn)程,其子進(jìn)程的執行不被理會(huì )。如果之前你在子進(jìn)程的執行routine上設置了斷點(diǎn),那么當子進(jìn)程執行到那個(gè)斷點(diǎn)時(shí),子進(jìn)程會(huì )因為收到一個(gè)SIGTRAP信號而自行終止,除非你在子進(jìn)程中攔截了該信號。

那么使用GDB該如何調試多進(jìn)程程序呢?在其參考手冊中提供了一種通用方法,這里說(shuō)說(shuō)(GDB在某些平臺上如HP-UX,還提供了更簡(jiǎn)便的方法,不過(guò)不具備通用性,這里不說(shuō)):

[測試程序]
我們先看看我們的測試程序:
/* in eg1.c */

int wib(int no1, int no2)
{
        int result, diff;
        diff = no1 - no2;
        result = no1 / diff;
        return result;
}

int main()
{
        pid_t   pid;

        pid = fork();
        if (pid <0) {
                printf("fork err\n");
                exit(-1);
        } else if (pid == 0) {
                /* in child process */
                sleep(60); ------------------ (!)

                int     value   = 10;
                int     div     = 6;
                int     total   = 0;
                int     i       = 0;
                int     result  = 0;

                for (i = 0; i < 10; i++) {
                        result = wib(value, div);
                        total += result;
                        div++;
                        value--;
                }

                printf("%d wibed by %d equals %d\n", value, div, total);
                exit(0);
        } else {
                /* in parent process */
                sleep(4);
                wait(-1);
                exit(0);
        }
}
該測試程序中子進(jìn)程運行過(guò)程中會(huì )在wib函數中出現一個(gè)'除0'異?!,F在我們就要調試該子進(jìn)程。

[調試原理]
不知道大家發(fā)現沒(méi)有,在(!)處在我們的測試程序在父進(jìn)程fork后,子進(jìn)程調用sleep睡了60秒。這就是關(guān)鍵,這個(gè)sleep本來(lái)是不該存在于子進(jìn)程代碼中的,而是而了使用GDB調試后加入的,它是我們調試的一個(gè)關(guān)鍵點(diǎn)。為什么要讓子進(jìn)程剛剛運行就開(kāi)始sleep呢?因為我們要在子進(jìn)程睡眠期間,利用shell命令獲取其process id,然后再利用gdb調試外部進(jìn)程的方法attach到該processid上,調試該進(jìn)程。

[調試過(guò)程]
我覺(jué)上面的調試原理的思路已經(jīng)很清晰了,剩下的就是如何操作的問(wèn)題了。我們來(lái)實(shí)踐一次吧!
我所使用的環(huán)境是Solaris OS 9.0/GCC 3.2/GDB 6.1。

GDB調試程序的前提條件就是你編譯程序時(shí)必須加入調試符號信息,即使用'-g'編譯選項。首先編譯我們的源程序'gcc -g -o eg1eg1.c'。編譯好之后,我們就有了我們的調試目標eg1。由于我們在調試過(guò)程中需要多個(gè)工具配合,所以你最好多打開(kāi)幾個(gè)終端窗口,另外一點(diǎn)需要注意的是最好在eg1的working directory下執行g(shù)db程序,否則gdb回提示'No symbol table isloaded'。你還得手工load symbol table。好了,下面我們就'按部就班'的開(kāi)始調試我們的eg1。

執行eg1:
eg1 &   --- 讓eg1后臺運行吧。

查找進(jìn)程id:
ps -fu YOUR_USER_NAME

運行g(shù)db:
gdb
(gdb) attach xxxxx  --- xxxxx為利用ps命令獲得的子進(jìn)程process id
(gdb) stop --- 這點(diǎn)很重要,你需要先暫停那個(gè)子進(jìn)程,然后設置一些斷點(diǎn)和一些Watch
(gdb) break 37 -- 在result = wib(value, div);這行設置一個(gè)斷點(diǎn),可以使用list命令察看源代碼
Breakpoint 1 at 0x10808: file eg1.c, line 37.
(gdb) continue
Continuing.

Breakpoint 1, main () at eg1.c:37
37                              result = wib(value, div);
(gdb) step
wib (no1=10, no2=6) at eg1.c:13
13              diff = no1 - no2;
(gdb) continue
Continuing.

Breakpoint 1, main () at eg1.c:37
37                              result = wib(value, div);
(gdb) step
wib (no1=9, no2=7) at eg1.c:13
13              diff = no1 - no2;
(gdb) continue
Continuing.

Breakpoint 1, main () at eg1.c:37
37                              result = wib(value, div);
(gdb) step
wib (no1=8, no2=8) at eg1.c:13
13              diff = no1 - no2;
(gdb) next
14              result = no1 / diff;
(gdb) print diff
$6 = 0        ------- 除數為0,我們找到罪魁禍首了。
(gdb) next
Program received signal SIGFPE, Arithmetic exception.
0xff29d830 in .div () from /usr/lib/libc.so.1

至此,我們調試完畢。

上面僅僅是一個(gè)簡(jiǎn)單的多進(jìn)程程序,在我們平時(shí)開(kāi)發(fā)的多進(jìn)程程序遠遠比這個(gè)復雜,但是調試基本原理是不變,有一些技巧則需要我們在實(shí)踐中慢慢摸索。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
使用 GDB 調試 Linux 軟件
程序員情感ORG: 信息“gdb(gcc 的debug 工具
GDB基本操作和應用
fork 函數詳解
core dump
段錯誤調試神器 - Core Dump詳解
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

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