2009-09-28 107 views
2

我一直是C程序員多年,我最喜歡的「調試器」一直是printf()函數 - 當絕對強制使用時,我只使用visual studio的調試器,因此從未非常熟練地使用它。最近我不得不修改一個程序,從C到C++(儘管當然printf仍然正常工作),並且程序的一部分現在已經出現在多個線程中(一個針對多核機器上的每個內核)以使程序運行更快。現在,我毫無疑問會遇到類似死鎖這樣的尷尬的多線程相關錯誤,並且我想知道我可以調用哪些調試方法。視覺工作室(2008)有我能合理需要的一切幫助我解決與線程有關的錯誤嗎?我現在應該花點時間學習如何使用第三方調試器嗎?我可以用我的老式printf來解決大多數問題嗎?調試多線程程序

我可以寫代碼,如果一直等待進入臨界區時會打印類似於「線程X等待輸入......但由於被線程Y使用而被阻塞」的代碼?

回答

10

Visual Studio在一定程度上支持線程調試。通過線程窗口,您可以選擇線程,掛起和恢復線程等。當您在線程之間切換時,相應地更新調用堆棧窗口,以便您可以檢查每個線程正在做什麼。你也可以限制斷點到特定的線程。

如果你想要一個替代的WinDbg(它是微軟提供的免費Debugging Tools for Windows包的一部分)提供了很多選項,但是稍微有一些更深奧的用戶界面。

至於使用printf,存在同步輸出的問題。如果你不這樣做,你的輸出很可能是胡言亂語。如果您同步它,則基本上會更改應用程序的併發性,這可能會影響您嘗試解決的問題。

0

如果你可以將你的項目移植到Linux上,Valgrind(尤其是'helgrind'工具)將完全按照你的要求進行操作。 http://valgrind.org/

0

我不確定這是否正是你所問的,但是,爲了幫助調試,你可以編寫代碼給每個線程一個「名稱」,以便將調試消息打印到調試窗口(或一個日誌文件或其他)包含該線程「名稱」以及您規定的其他信息。下面的代碼是在C#中,但這是,即使在非託管C++

Thread T = new Thread(RunSchedule); 
    T.Name = "Scheduler"; // <=== Thread given a name here... 
    T.Start(); 
+1

這可以通過使用WIN32 API函數void SetThreadName(DWORD dwThreadID,LPCSTR szThreadName)在「純」本機C和C++中實現。這些名稱也應該顯示在VS調試器中(我沒有檢查過)。 – mmmmmmmm 2009-09-28 16:11:14

0

英特爾提供了多種工具,找出線程相關的問題可供選擇:數據競爭,死鎖,性能損失。這些工具是:英特爾線程檢查器,英特爾線程分析器。