C#使用线程窗口调试多线程程序
調試多線程程序一般有以下幾種辦法
1、在日志的某個地方寫日志文件。
優點:不會干擾程序的執行,特別是對網絡的多線程通信。
缺點:每次都需要打開日志文件以查看進程運行的信息。
2、利用斷點進行調試。
優點:直觀,可以直接看到運行過程的值
缺點:在多個線程設置斷點,可能讓程序跳來跳去,還需要額外地分出一部分精力用來理清程序的邏輯
3、利用彈出窗口來查看進程調試的信息。
優點;直觀
缺點;在調試網路通信的時候,使得通信的過程產生延時,導致通信失敗。
4、利用vs自帶的線程窗口來調試
優點:直觀,可以直接從進程圖上看到哪個進程是活動進程,哪些進程處于阻塞狀態。
缺點:需要結合斷點調試,基本上就是斷點調試的加強版
前面三種都比較基礎大多數人應該已經掌握了 ,下面針對第四種再詳細說明下:
比如以下示例:開了兩個線程
Task.Run(() =>{var count = 0;while(true){Thread.Sleep(1000);Console.WriteLine($"{count}");count++;}});Task.Run(() =>{var count = 0.12345;while (true){Thread.Sleep(1000);Console.WriteLine($"{count}");count += 0.1; ;}});我僅在第一個線程設置了斷點,只想在第一線程跟蹤變量變化,但是實際上單步調試的時候你會發現,程序會跳來跳去,一會兒再上面哪個線程,一會兒又在下面哪個線程執行,
這時候的一般的做法是:
這是我做的:
設置一個條件斷點,我知道這個斷點只會出現在我正在尋找的線程上。
一旦斷點命中并且你在你想要的線程中,在Visual Studio線程窗口中(在調試,調試 - > Windows - >線程時),Ctrl+?A(選擇所有線程),然后Ctrl+單擊您當前所在的線程。除了要調試的線程之外,您應該擁有所有線程。
單擊鼠標右鍵,然后選擇“凍結”。
但是實際上:
凍結/解凍線程是一種不正確的方式,因為其他線程不執行任何代碼。
最正確和最有用的方法是:
在斷點窗口中按Ctrl + A(選擇所有斷點)。
右鍵單擊并選擇“過濾器...”。
輸入“ThreadId =(當前線程ID)”。
在Visual Studio 2015及更高版本中,過程類似于:
在斷點窗口中按Ctrl + A(選擇所有斷點)。
右鍵單擊并選擇“設置...”。
選中“條件”,然后在下拉列表中選擇“過濾器”
輸入“ThreadId =(當前線程ID)”。
所以所有線程都被執行,但調試器僅在當前線程上命中。
總結
以上是生活随笔為你收集整理的C#使用线程窗口调试多线程程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万字长文,带你彻底理解EF Core5的
- 下一篇: 在 Azure App Service