C++包含了一個線程庫,提供了多線程和線程間同步的機制。多線程的C++程序很常見,因此考慮多線程程序調(diào)試時的特殊情況非常重要。多線程程序的bug往往因為操作系統(tǒng)調(diào)度中時序的不同而引起,很難重現(xiàn)。因此,調(diào)試多線程程序需要采用一套特殊的技術(shù):
 ?。?)使用調(diào)試器:調(diào)試器很容易診斷某些多線程問題;例如死鎖。出現(xiàn)死鎖時,調(diào)試過程會進入調(diào)試器,檢查不同的線程。在調(diào)試器中,可以看到哪些線程被阻塞,它們在哪行代碼被阻塞。將這些信息與跟蹤日志相比較,可以看出程序是如何進入死鎖情形的,這足以解決死鎖。
 ?。?)使用基于消息的調(diào)試:調(diào)試多線程程序時,基于消息的調(diào)試可能比使用調(diào)試器更有效。在程序中的臨界區(qū)之前和之后,以及獲得鎖之前和釋放鎖之后添加調(diào)試語句。基于消息的調(diào)試對觀察競爭條件極其有效,但添加日志語句會輕微改變運行時時序,這可能會隱藏bug。
 ?。?)插入強制休眠和上下文切換:如果一致地重現(xiàn)問題有苦難,或者對問題發(fā)生的根源有感覺但是想要驗證這個根源,那么可以讓現(xiàn)場睡眠特定的時間,強制執(zhí)行特定的調(diào)度行為。在釋放鎖之前休眠幾秒鐘,或?qū)δ硞€條件變量發(fā)出信號之前休眠幾秒鐘,或在訪問共享數(shù)據(jù)之前休眠幾秒鐘,可能表現(xiàn)出競爭條件(如果不休眠則可能無法檢測到)。如果通過這個調(diào)試技術(shù)找到問題的根源,那么必須將這個問題修復(fù),這樣在移除了這些強制休眠和上下文切換之后,代碼就能正常工作。把這些強制休眠和上下文切換留在程序中而“解決問題”的方法是錯誤的。
 ?。?)核查代碼:核查線程同步代碼常常有助于解決競爭條件。不可能反復(fù)嘗試已發(fā)生的情形,直到看出該情形是如何發(fā)生的。在代碼注釋中記下這些“證據(jù)”是無害的。另外,請同事與自己一起調(diào)試,他可能會看到自己忽略的東西。

聊天記錄

 

★關(guān)于WorkWin公司電腦監(jiān)控軟件★

WorkWin的使命是打造Work用途的Windows 電腦系統(tǒng),有效規(guī)范員工上網(wǎng)行為,讓老板知道員工每天在做什么(監(jiān)控包括屏幕、上網(wǎng)在內(nèi)的一舉一動),限制員工不能做什么(禁止網(wǎng)購、游戲、優(yōu)盤等)。

WorkWin基于純軟件設(shè)計,非常容易使用,無需添加或改動任何硬件,使用一臺管理機監(jiān)控全部員工機電腦。歷經(jīng)南京網(wǎng)亞十余年精心打造,此時此刻每天都有成千上萬企業(yè)電腦正在運行WorkWin,選擇WorkWin選擇“贏”。

WorkWin介紹

WorkWin監(jiān)控首頁 短視頻講解 下載免費試用版

版權(quán)所有,南京網(wǎng)亞計算機有限公司 。本文鏈接地址: 調(diào)試多線程程序