2013-03-19 29 views
1

有一些代碼,我正在使用一個奇怪的問題: 據我所知和據我簽有代碼中沒有成分,依賴於任何隨機的,像系統時間等。 然而,只需在代碼中添加一個斷點並且程序的行爲發生變化即可。它沒有做任何錯誤,它只是行爲不同(在代碼中有幾個對象被某個值選中,對於所有這些對象都是0--它只是在添加斷點時選擇一個值爲0的不同對象) 。 不幸的是,不可能發佈任何代碼,因爲它太多了。添加斷點改變程序的行爲

什麼會導致這種行爲?

編輯: 我花了一些時間上的問題:它似乎並沒有涉及到斷點自己 - 在「最簡單」的方式來產生不同的結果如下:當開始從不同的調試過程。項目的cpp文件輸出已經變化。當禁用「自動生成」時,這不會再發生。我從中得出的結論是,即使代碼沒有變化,也會重建一些東西。 我也將其縮小到實際導致不同行爲的類:它是斐波那契堆的實現。

+0

完全莫名其妙的行爲通常(通常?)意味着你的一些代碼有未定義的行爲,但確切地說什麼或哪裏是不可能的,沒有代碼可以猜測。我會*不*忽視它 - 雖然奇怪但無害的行爲並不總是無害。 – 2013-03-19 20:34:56

+1

是否意味着選擇多個對象並按不同的順序進行操作,或者選擇其中一個對象並選擇其他對象。無論哪種方式優化是一個突出的候選人。 – 2013-03-19 20:39:08

+0

它應該從衆多中選擇一個並選擇不同的一個。優化已停用。 – MrWayne 2013-03-19 20:41:54

回答

0

如果您沒有在Windows上運行,則可以考慮使用Valgrind - these are the supported platformsMemcheck工具將運行您的程序(較慢),查看每個內存引用以追蹤未初始化變量的使用情況。

MEMCHECK可以檢測,如果你的程序:

  • 訪問內存,它不應該(地區尚未分配,已被釋放的區域,面積近堆塊,堆的交通不便地區的結束)。
  • 以危險的方式使用未初始化的值。
  • 泄漏內存。
  • 堆塊是否有問題(雙重釋放,不匹配的釋放)。
  • 將重疊的源和目標內存塊傳遞給memcpy()及相關函數。
+0

不幸的是我使用的是Windows,而且我已經使用了內存檢查工具做了一些工作 - 它們的確出現了一些問題,但這很可能是由程序中發生的大量重新分配引起的。 – MrWayne 2013-03-19 23:41:41

相關問題