我想添加幾個單元測試到我的代碼,也因爲我加載插件我不總是有權訪問我正在運行的代碼。 我真的想檢查的測試是否我所調用的函數是無鎖的?如何(單元)測試函數是否鎖定空閒?
是否有任何鉤子或方法來測試如果在我的程序中的A點和B點之間存在對非鎖定自由函數的調用?
另一個不那麼複雜的函數是如何將所有調用掛接到鎖定函數(如鎖,系統調用...)。我知道如何掛鉤調用malloc在Windows上,但沒有別的。
謝謝您的幫助
我想添加幾個單元測試到我的代碼,也因爲我加載插件我不總是有權訪問我正在運行的代碼。 我真的想檢查的測試是否我所調用的函數是無鎖的?如何(單元)測試函數是否鎖定空閒?
是否有任何鉤子或方法來測試如果在我的程序中的A點和B點之間存在對非鎖定自由函數的調用?
另一個不那麼複雜的函數是如何將所有調用掛接到鎖定函數(如鎖,系統調用...)。我知道如何掛鉤調用malloc在Windows上,但沒有別的。
謝謝您的幫助
你不能。
您可以用pthread_lock
的不同實現替代,但代碼可以直接調用例如futex
,如果您替換該代碼仍然可以直接使用syscall(SYS_futex,...)
調用它。您可以剖析代碼或使用類似strace
的東西來檢測所有此類調用,但仍不會告訴您代碼是否在程序集中實現了自己的自定義螺旋鎖。
我敢肯定你不能這樣做,沒有插裝鎖,或者類似的東西。
我們可以想出很多情況,其中鎖定函數的調用在測試中會導致不同的行爲[可能只有在「啓用特定測試模式以識別測試時」時)纔會比生產代碼中的行爲更糟糕 - 例如,add睡眠100ms進入鎖定方法,並嘗試使用另一個鎖定功能,並將時間與「沒有競爭對手的鎖相比較。」
或者我們可以保留一個鎖定呼叫的計數,並查看計數之前和在功能相同之後(或者已經增加了預期的數量,如果該功能應該呼叫lock
一定次數)。
但是一種通用的方式是侵入鎖定機制,我敢肯定這是不可能的。
當然,代碼審查和明確的文檔,關於哪些代碼調用鎖定,哪些不會也很有用 - 以及出色的審閱者發現錯誤。
由於其他人已經回答,因此無法測試算法是否無鎖。但是,可以測試它在多線程環境中的行爲一致性。我在這個領域的經驗是隻使用一個無鎖隊列(我自己寫的,但是基於一篇學術論文),所以我的測試是基於一個可能對你有用或不可用的隊列。
我使用多個線程來測試錘隊列。
在我的測試中,我也改變了讀者和作者的數量。根據讀者與作者的比例,隊列行爲將有所不同。讀者多於作者通常會導致幾乎爲空的隊列,而反過來會導致隊列不斷擴大,直到作者停止寫入。
第2點可能是你感興趣的,因爲你一般可以根據重負載下響應時間的變化來判斷算法是否是無鎖的或不是。如果響應時間在重負載下保持快速,那麼您可以推斷該算法是無鎖的。或者至少如果不是,它的行爲如果是。
正如我所說我沒有控制功能的代碼悲傷 – dzada
我的答案是,這樣做不會工作。 –
是的,這是真的對不起。事情也是,我正在macosx和windows上工作。但是,除了用戶編寫自己的旋轉鎖定以外的所有系統調用都不是什麼大問題。因爲,這就好像他基本上是在等待原子的寫作一樣,我知道我不會理解這一點。我並不是在尋找完美的解決方案,我正在尋找一種很好的方法來捕捉我的代碼的用戶可能做的大部分內容 – dzada