gdb命令中attach使用
[測(cè)試程序]
我們先看看我們的測(cè)試程序:
/* 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);
??????? }
}
該測(cè)試程序中子進(jìn)程運(yùn)行過程中會(huì)在wib函數(shù)中出現(xiàn)一個(gè)'除0'異常。現(xiàn)在我們就要調(diào)試該子進(jìn)程。
[調(diào)試原理]
不知道大家發(fā)現(xiàn)沒有,在(!)處在我們的測(cè)試程序在父進(jìn)程fork后,子進(jìn)程調(diào)用sleep睡了60秒。這就是關(guān)鍵,這個(gè)sleep本來是不該存在于子進(jìn)程代碼中的,而是而了使用GDB調(diào)試后加入的,它是我們調(diào)試的一個(gè)關(guān)鍵點(diǎn)。為什么要讓子進(jìn)程剛剛運(yùn)行就開始sleep呢?因?yàn)槲覀円谧舆M(jìn)程睡眠期間,利用 shell命令獲取其process id,然后再利用gdb調(diào)試外部進(jìn)程的方法attach到該process id上,調(diào)試該進(jìn)程。
[調(diào)試過程]
我覺上面的調(diào)試原理的思路已經(jīng)很清晰了,剩下的就是如何操作的問題了。我們來實(shí)踐一次吧!
我所使用的環(huán)境是Solaris OS 9.0/GCC 3.2/GDB 6.1。
GDB 調(diào)試程序的前提條件就是你編譯程序時(shí)必須加入調(diào)試符號(hào)信息,即使用'-g'編譯選項(xiàng)。首先編譯我們的源程序'gcc -g -o eg1 eg1.c'。編譯好之后,我們就有了我們的調(diào)試目標(biāo)eg1。由于我們?cè)谡{(diào)試過程中需要多個(gè)工具配合,所以你最好多打開幾個(gè)終端窗口,另外一點(diǎn)需要注意的是最好在eg1的working directory下執(zhí)行g(shù)db程序,否則gdb回提示'No symbol table is loaded'。你還得手工load symbol table。好了,下面我們就'按部就班'的開始調(diào)試我們的eg1。
執(zhí)行eg1:
eg1 &?? --- 讓eg1后臺(tái)運(yùn)行吧。
查找進(jìn)程id:
ps -fu YOUR_USER_NAME
運(yùn)行g(shù)db:
gdb
(gdb)?attach xxxxx?--- xxxxx為利用ps命令獲得的子進(jìn)程process id
(gdb)?stop?--- 這點(diǎn)很重要,你需要先暫停那個(gè)子進(jìn)程,然后設(shè)置一些斷點(diǎn)和一些Watch
(gdb)?break?37?-- 在result = wib(value, div);這行設(shè)置一個(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??????? ------- 除數(shù)為0,我們找到罪魁禍?zhǔn)琢恕?br /> (gdb)?next
Program received signal SIGFPE, Arithmetic exception.
0xff29d830 in .div () from /usr/lib/libc.so.1
至此,我們調(diào)試完畢。
轉(zhuǎn)載于:https://www.cnblogs.com/djzny/p/4956752.html
總結(jié)
以上是生活随笔為你收集整理的gdb命令中attach使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学建模预测模型实例(二)---表白墙影
- 下一篇: 父类与子类之间的关系