2012-11-13 51 views
1

我正在努力調試我正在處理的多線程C++程序。它似乎在代碼中的同一個地方崩潰,但只有一部分時間由於變量被另一個線程釋放,導致程序在該變量被指針訪問之後崩潰。多線程gdb - 在崩潰之前跟蹤變量更改

因此,我無法逐步完成調試程序。有什麼方法可以跟蹤gdb中特定變量的所有實例,並跟蹤對該內存位置執行了哪些特定操作(這樣我可以看到誰將它釋放,並在哪裏)?或者有沒有其他好的方法來調試呢?

回答

4

我掙扎調試,我在

工作用GDB進行調試(或任何其他調試器)多線程程序硬一個多線程的C++程序。

對於具體的例子,你給了:一個線程free()荷蘭國際集團的內存另一個線程仍在訪問,ValgindAddressSanitizer可能會產生比GDB更好的結果。

+0

感謝您的回覆,我會看看您鏈接到的兩個工具。我肯定學會了解調試多線程代碼的困難。我正在開發一個缺乏良好文檔的項目,我花了近40個小時試圖調試這個問題,其中包括5個小時與一個對該項目更爲了解的人一起工作。 – xur17

+0

我正在嘗試使用AddressSanitizer,但我必須將所有的MakeFiles更改爲使用clang/clang ++而不是gcc和g ++。這樣做也會導致其他問題......有什麼方法可以用gcc/g ++來調試嗎? – xur17

+0

@ xur17「更改所有的Makefiles」 - 這意味着你寫錯了它們。你應該在'Makefiles'中使用'CC'和'CXX'宏。如果你這樣做了,你只需要'使CC = clang CXX = clang ++',你就完成了。 「導致其他問題」 - 克朗更嚴格;無論如何,你的其他問題可能需要清理(它甚至可能暴露你正在尋找的bug)。 「有沒有什麼辦法可以用gcc進行調試」 - 你必須使用Valgrind,它不需要重建源代碼。 –