我正在開發嵌入式Linux系統(3.12.something),而且我們的應用程序在經過一段隨機時間後開始佔用中央處理器。我對我們的應用程序運行strace
,當問題發生吧,我看到很多在strace
輸出類似於這樣的行:如何從strace輸出中確定我的程序的哪部分未能獲得互斥鎖
[48530666] futex(0x485f78b8, FUTEX_WAIT_PRIVATE, 2, NULL) = -1 EAGAIN (Resource temporarily unavailable) <0.009002>
我敢肯定,這是確鑿的證據,我尋找和有某種比賽。然而,我現在需要弄清楚如何確定代碼中試圖獲得這個互斥體的地方。我怎樣才能做到這一點?我們的代碼是用GCC編譯的,並且有調試符號。
我目前的想法(我還沒有嘗試過)是打印出一個字符串輸出到stdout和flush之前試圖抓住我們系統中的任何互斥體,期望在strace抱怨獲得字符串之前,鎖......但代碼中有很多地方需要這樣安裝。
編輯:我剛剛意識到的另一個奇怪的事情是,我們的程序不會開始佔用CPU,直到運行一段隨機時間(5分鐘到5小時以及之間的任何地方)。在此期間,有零futex
系統調用發生。他們爲什麼突然開始?從我讀過的東西,我想也許他們正在用戶空間中正確使用,直到出現故障並回退到製作futex()
系統調用...
有什麼建議嗎?
只有競賽鎖可見,您可以嘗試與gdb合作。 strace確實有一個線程輸出切換以及由pid給出strace輸出。 –
我將如何使用gdb來找到它?它能否以某種方式檢測到這種情況並自動中斷? (我不想看到幾個小時的問題開始......) – Steve
好吧,它看起來像'catch syscall 240'將在gdb中工作。我會給你一個鏡頭。 – Steve