2012-05-01 11 views
7

我想記錄同步操作,例如鎖,sempahores,多線程應用程序的障礙,以便稍後可以重放錄製的應用程序,以便進行調試。如何重播多線程應用程序?

在途中是提供你自己的鎖,sempaphore,條件變量等等。功能,也做日誌,但我認爲這是一個矯枉過正,因爲下來,他們必須使用一些共同的同步操作。

所以我的問題是我應該記錄哪些同步操作,以便我需要對我的程序進行最小限度的修改。換句話說,glibc和系統調用中的函數或宏是通過哪些函數或宏來構建的?所以我只修改那些用於記錄和回放的內容。

+0

記錄所有同步操作如何讓您「重放錄製的應用程序」?程序比同步操作的順序還要多,特別是在由於缺少同步而導致競爭條件的情況下(這也是我想要的調試幫助的問題)。 –

+0

目前,忘了比賽條件。我知道他們也很重要。 – pythonic

+0

['strace(1)'](http://linux.die.net/man/1/strace)可能會有所幫助,但它不會捕獲完全在用戶空間中發生的同步操作,而無需轉換到內核,例如作爲無爭議的互斥鎖。 –

回答

1

我能想到的是用gdb調試中「記錄」模式中的最佳:

根據此頁:GDB Process Record線程支持正在進行中,但它可能不完整然而。


並非嚴格回答你的問題,我建議

在其他平臺上,其他幾個線程檢查器的存在,但我也不多了與他們的經驗。

1

就你而言,在Linux上「記錄」系統調用的一種有效方法可能是使用LD_PRELOAD技巧,並用你自己的呼叫版本覆蓋實際的系統調用,以記錄呼叫的使用然後轉發到實際的系統調用。

更廣泛的例子給出here in Linux Journal

正如您在這些鏈接中所看到的,「技巧」的基本要點是您可以讓系統在任何其他系統庫(如pthread等)之前加載您自己的動態庫,然後屏蔽呼叫通過將這些函數的版本作爲先導,將這些函數映射到這些庫函數。然後,您可以在您的上層功能中記錄原始功能的使用情況,並將參數傳遞給您嘗試記錄的實際呼叫。

這種方法的好處在於,它幾乎可以捕獲任何可以進行的調用,既可以是完全保留在用戶區域中的函數,也可以是調用內核的函數。