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