簡體   English   中英

如何檢測內存訪問沖突和/或內存爭用情況?

[英]How do I detect memory access violation and/or memory race conditions?

我有一個目標平台報告何時讀取或寫入內存以及何時獲取/釋放鎖(例如,認為互斥鎖)。 它報告程序計數器,數據地址和讀/寫標志。 我正在編寫一個程序在接收報告的單獨主機上使用此信息,以免干擾目標。 目標已經報告了該數據,因此我根本不會更改目標代碼。

是否有參考文獻或已有的算法可以進行這種檢測? 例如,當多個線程試圖寫入全局變量而不首先保護它時,一種檢測競爭條件的方法。

我目前正在醞釀自己的計划,但我確信自己肯定已經有一些代碼可以做到這一點。 或者至少是一些經過驗證的算法。

注意這不是檢測內存泄漏。

注意實現語言是C ++

我試圖使檢測代碼與平台無關,因此我使用的是STL,而僅使用帶有Boost,poco,loki之類的庫的Standard C ++。

任何線索都會有所幫助

謝謝。

讓您擺脫困境可能為時已晚,但這是行不通的。 線程爭用是由線程之間的細微時序問題引起的。 您永遠無法通過日志記錄來診斷與計時相關的問題。 Heisenbergian,只是記錄會更改線程的時間。 特別是您正在考慮的那種。 臭名昭著的是,有很多附帶日志記錄的軟件一直處於打開狀態,因為它會隨着關閉狀態而下降。

清除線程錯誤很難。 有效的工具是有意在代碼中插入隨機延遲的工具。 Microsoft CHESS是一個示例,也可以在本機代碼上運行。

僅解決您的問題的一部分,比賽條件極其惡劣,因為沒有很好的方法來測試它們。 根據定義,它們是難以預測的事件序列,很難診斷。 檢測代碼取決於種族狀況實際上正在發生的事實,在這種情況下,無論如何,您很可能會看到錯誤的行為。 您添加的任何測試代碼都可能使它們或多或少地出現,甚至可能更改時間以使它們根本不會出現。

與其嘗試檢測競爭狀況,不如嘗試通過程序設計來幫助您從一開始就更加靈活地進行競爭?

例如,如果您將全局變量簡單地封裝在一個對象中,該對象知道在訪問時需要進行的所有適當保護,則線程不可能同時寫入該對象,因為這樣的接口不存在。 與嘗試通過算法檢測競態條件相比,以編程方式防止競態條件要容易得多(可能是在單元/子系統測試期間您仍然會發現某些情況)。

沒有標准的方法,因為C / C ++標准沒有處理特定於操作系統的概念,例如內存保護。 看一下Breakpad ,Mozilla在OS X,Win32或Linux等各種平台上使用的崩潰報告庫。

請查看Andrei Alexandrescu的這篇文章: http : //www.drdobbs.com/184403766 ;jsessionid= LKUUBKFR00O0VQE1GHRSKH4ATMY32JVN

它主張在由多個線程訪問的數據上使用volatile關鍵字。 如果您通過鎖定機制消除了這種波動性,則將通過編譯器錯誤知道需要鎖定該數據的位置。

我使用了這種方法,發現它非常有用。

希望能有所幫助。

如果您可以在Valgrind下運行您的應用程序,則它包括一個名為Helgrind的工具,旨在檢測以下種族: http ://valgrind.org/docs/manual/hg-manual.html

暫無
暫無

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

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