乙個古怪的bug除錯過程

2021-05-28 15:33:01 字數 2371 閱讀 4449

也許這也不能算是乙個bug,只不過沒有了解清楚乙個函式的確切用法罷了。這一切都源於乙個經典的程式:

#include

#include

int main(void)

return 0;

}當我輸入abcd'\n'的時候,輸出是abcd'\n',這很正常;

當我輸入ctrl+d(也就是eof),結束程式,這也很正常;

但是,如果我輸入abcd'eof'呢?結果會在當前行輸出abcd,按照道理,程式讀取到eof是會結束的嗎?這到底發生什麼事了?

如果沒有強大的除錯工具gdb的幫助下,也許這就一直是我乙個小小的困惑,但是gdb太好用了,所以我發現了問題的所在。

讓我先gdb一下吧:

先把斷點設定子line 8:break 8

接著run,display input和upper,你會發現這兩個字元是會有初始值的:

1: input = 0 '\000'

2: upper = 40 '('

然後,step,程式會進行while語句,由於input!=eof,所以會進行getchar函式,這時候可以輸入字元,我輸入

ab'eof'

神奇的事情發生了,當我輸入eof之後,程式立馬退出getchar函式,來到下一語句:

(gdb) s

ab10upper=toupper(input);

2: upper = 40 '('

1: input = 97 'a'我們可以看到這時候input已經接收了第乙個字元a

我們接著s:

(gdb) s

11putchar(upper);

2: upper = 65 'a'執行過toupper函式之後,upper等於字元a

1: input = 97 'a'

接著s,我發現這時候字元a並沒有輸出,而是直接跳至while迴圈:

(gdb) s

8while((input=getchar())!=eof)

2: upper = 65 'a'

1: input = 97 'a'

接著s,跟之前類似:

(gdb) s

10upper=toupper(input);

2: upper = 65 'a'

1: input = 98 'b'

接著s,還是跟之前類似:

(gdb) s

11putchar(upper);

2: upper = 66 'b'

1: input = 98 'b'

接著s,又跳至while迴圈,putchar還是沒有輸出:

(gdb) s

8while((input=getchar())!=eof)

2: upper = 66 'b'

1: input = 98 'b'

我們再接再厲,s一下:

這時候很神奇的是:終於有輸出了,是在輸入當前行輸出ab。

當我們直接輸入eof的時候,getchar馬上接收到eof訊號退出函式。

我再來乙個正常的例子來實驗一下,輸入為:ad'\n',結果發現

程式執行到最後乙個字元回車符的時候,就已經可以輸出了:

(gdb) s

11putchar(upper);

2: upper = 10 '\n'

1: input = 10 '\n'

(gdb) s

ad跳至while迴圈的時候已經有輸出了

8while((input=getchar())!=eof)

2: upper = 10 '\n'

1: input = 10 '\n'

我把上面的情況總結一下:

(1)getchar只認得第乙個輸入的eof,如果前面有多個字元後面接著乙個eof,則eof只會讓getchar函式結束,getchar不會接收eof,只接收前面輸入的字元;

(2)putchar不是馬上輸出字元,而是乙個乙個輸出,如果遇到回車,則輸出所有字元,但是如果是多個字元加乙個eof,情況就發生改變,執行完putchar並不馬上輸出,而是要執行至getchar函式後才輸出。

這實在是乙個難以解釋的bug。

不過,我猜測是這樣的:

getchar函式和putchar函式共同維護著同乙個緩衝區,getchar函式在執行之前會將緩衝區內部的所有資料清空並輸出,由於剛開始的時候緩衝區都是'\0',所以什麼也沒有顯示,我只能看到getchar正準備接收字元。putchar函式則會再遇到'\n' 的時候將緩衝區資料輸出,由於我們是多個字元後面接著eof,且eof沒有被getchar讀取,所以putchar再執行至最後乙個字元時仍然不輸出。直到再次執行getchar函式,它將緩衝區所有的字元輸出,所以我們看到輸出了。getchar只能認識第一次就輸入的eof,否則會讓其退出。

這便是我的猜測了,如果能看到源**,那問題就好辦多了。

MyEclipse除錯過程中遇到乙個奇怪的問題

雖然看著別人的 有些頭大,但是咱目標也不高,調通了就成。為了除錯方便,我將tomcat下配置的應用全都去掉了,想看看tomcat會不會報錯。在啟動tomcat時顯示某個應用目錄不存在,不是取消全部應用了嗎?找一找原來是server.xml中設定了context。刪掉這個配置,仍然報錯,找不到應用目錄...

測試過程中如何快速定位乙個bug

作為測試人員,和我們最常打交道的,莫屬bug。但是測試不只是負責發現問題,除了發現問題這種基本功外,定位問題,提出解決方案,提出預防方案也是要掌握的技能。如何快速定位乙個bug,就需要對功能 產品的流程 開發方案 開發人員非常熟悉。遇到乙個bug的時候,我們要去定位發現這個bug的 是屬於前端還是後...

測試過程中如何快速定位乙個bug

作為測試人員,和我們最常打交道的,莫屬bug。但是測試不只是負責發現問題,除了發現問題這種基本功外,定位問題,提出解決方案,提出預防方案也是要掌握的技能。如何快速定位乙個bug,就需要對功能 產品的流程 開發方案 開發人員非常熟悉。遇到乙個bug的時候,我們要去定位發現這個bug的 是屬於前端還是後...