簡體   English   中英

如何調試僅死鎖作為獨立應用程序的多線程程序

[英]How to debug a multi-threaded program that only deadlocks as a standalone application

我有一個使用2個線程的C ++程序。 通過Visual Studio運行時,該程序可以在“調試”和“發布”模式下正常運行。 但是,當作為獨立應用程序運行時,它總是停滯。 我試圖添加printf消息,以便可以將信息輸出到屏幕,但這只是解決了我的問題。 我將郵件撤回,然后又回到原來的問題。

有人有智慧的智慧之言可分享這樣的問題嗎?

您可以簡單地獨立運行該程序,等待其死鎖,然后使用“工具”->“附加到進程...”來附加Visual Studio。

然后選擇您的進程,並在附加后按“暫停”。

然后,您可以使用所有調試器功能,並監視所有線程,堆棧和變量...

如果您有權訪問Visual Studio 2010 Professional(或更高版本),則可能需要通過“ Analyze->Launch Performance Wizard->Concurrency菜單(啟用“ Visualize the behavior of a multithreaded application選項)嘗試探查器。

您的程序將被檢測並運行,然后您應該能夠通過相關的調用堆棧查看哪些線程阻塞了哪個線程。

要找到您的錯誤,您需要收集一些跟蹤信息。 您的工具需要滿足以下要求:

  1. 不增加任何延遲
  2. 不使用任何鎖定
  3. 多線程安全
  4. 跟蹤以正確的順序發生了什么。

大多數工具使用鎖定並增加過多的延遲,這將改變您已經發現的程序的行為。 但是實際上,您可以將自己的跟蹤記錄寫入內存。 在C#中,它看起來像這樣:

public const int MaxMessages = 0x100;
string[] messages = new string[MaxMessages];
int messagesIndex = -1;

public void Trace(string message) {
  int thisIndex = Interlocked.Increment(ref messagesIndex);
  messages[thisIndex] = message;
}

Trace()方法是安全的,無阻塞的多線程方法,可以從任何線程調用。 在我的PC上,執行大約需要2微秒,這應該足夠快。

在任何您認為可能出問題的地方添加Trace()指令,讓程序運行,等待錯誤發生,停止跟蹤,然后調查跟蹤是否有任何錯誤。

此方法的更詳細說明,該方法還收集線程和計時信息,回收緩沖區並很好地輸出跟蹤,您可以在以下位置找到:CodeProject:實時調試多線程代碼1

我還沒有(在記憶中)在多線程應用程序中調試Heisenbug的樂趣,因此請多加建議。

通常,調試涉及三個關鍵活動:

  1. 觀察:運行程序,看看會發生什么,在調試器下運行程序,添加日志消息,添加斷言等。

  2. 分析:查看您已經編寫的代碼。 文件功能。 希望您會在邏輯中句中遇到缺陷。

  3. 猜想:運用您的想象力提出可能會出錯的事情。

由於(1)不適用於您的情況,請嘗試(2)和(3)。 查看您的代碼,以確保您沒有犯明顯的錯誤。 想象一下可能導致程序死鎖的情況。 瀏覽Wikipedia上關於Deadlock的文章

此外,尋找其他方法來觀察程序的行為。 例如,查看可以在不使錯誤消失的情況下添加打印語句的位置,因為這可能會提供線索。

雖然我不知道您的工具鏈,但是使用gcc修復死鎖的一種簡單方法是使用調試信息來構建程序,但是要進行充分優化,運行程序直到死鎖發生,然后使用產生核心轉儲的方法將其殺死信號(例如SIGSEGV )。 核心轉儲為您提供了有關死鎖的寶貴信息。

我知道您正在使用Microsoft工具鏈,但是也許您可以將其翻譯成他們的條款。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM