2011-01-12 62 views
0

好的,夥計們。我以前從來沒有遇到過這種情況,它使頭腦變得難以理解,並且不合邏輯。我有一個有點複雜的循環,我想嘗試通過放置一些printf語句來查看是否一切正常。我使用printf查看中間產品,並驗證答案是否正確。然後,當我將printf註釋到中間產品時,答案是錯誤的。有沒有人遇到過這個?這使我瘋了,我看不出printfs如何改變答案.... X_x如果有幫助,我使用的是C/C++編譯器。感謝您的任何建議..試圖利用printfs時的神祕c調試問題

這裏是一個片段...

printf("splitBackground = %d, numWindowPoints = %d\n", splitBackground, numWindowPoints); 
splitBackground = splitBackground/numWindowPoints; 
printf("%d ", splitBackground); 

這是一件好事,但是當我註釋掉的第一行代碼,它被證明是不正確巨大。 :(

+5

請給我們看看代碼! – William 2011-01-12 00:46:31

回答

7

很可能你在代碼中犯了一個錯誤,導致了未定義的行爲,而「undef訂爲「暗示」它可能在某些情況下工作「。

爲什麼要插入printf使它工作?一些可能性:

它改變了你的程序的不同部分之間,或者你的程序和世界其他地方之間的時序關係。

printf調用禁止可能發生的編譯器優化。

printf調用以防止發生錯誤的方式更改標準庫的內部狀態。

printf調用與硬件交互以防止發生錯誤的方式。

(請注意,許多相同的考慮也真調試器下運行時 - 因此,術語「heisenbug」:只出現一個錯誤,當你不看它)

1

個人如果您使用的是IDE我會打印到stderr,而不是標準輸出。

我想借此調試器的充分利用,以嘗試解決您的問題。就像在Visual Studio 2010中,Eclipse或NetBeans中添加破發點,並通過代碼行慢慢步驟。

0

您的printf的可以有副作用(修改一些數據導致正確的結果)。在任何情況下,這將是非常有幫助的看的簡化的例子有問題的代碼

0

也許,這是堆棧損壞,並且你的某個方式擴展堆棧或觸發一個守衛頁面或其他東西。但沒有其他代碼就很難說出任何內容。