2013-03-15 130 views
0

我有一個ARM設備,我想調試它。我的主機是Linux 12.04,我正在使用Eclipse。 GDBServer在我的目標設備上運行。Linux遠程調試線程錯誤(GDBServer)

我可以調試單個進程應用程序。但是,當我想調試包含pthread對象的多線程應用程序時,調試失敗。 我跑一步一步的,但是當我來到

pthread_create(&timerSettings.timerThread, NULL, &timerThread, NULL); 

線調試器會提示以下錯誤: 沒有可用的「0x40174c84」源。

那我該怎麼辦?

有什麼建議嗎?

謝謝。

回答

1

通過逐步運行,您實際上要求調試器進入phread_create()函數,當然您還沒有該源代碼。如果因爲我懷疑你期望調試器會把你帶到你的線程的源頭,那麼我有一些壞消息;它不以那種方式工作。

如果你跨過pthread_create(),它將創建你的線程,如果你在Debugger透視圖中,它應該顯示在Eclipse的任務列表中。你可以從那裏選擇你的線程。如果你這樣做,源代碼視圖將跳轉到該線程所到達的地方(更多壞消息來臨)。請記住,所有這些都需要相對現代版本的gdb(我記得6以上)。

現在你的問題真的開始了。用gdb中的線程進行調試並不是很好。當你選擇你的線程時,你可能會發現沒有顯示源代碼。這是因爲儘管您已經跨過了pthread_create(),但這並不意味着線程已經進展到您的第一行源代碼。這是因爲當gdb掛起程序時,該程序中的每個線程都被掛起,並且新線程可能沒有脫離標準庫的線程初始代碼。所以你必須在你的線程的第一行源代碼中設置一個斷點,並允許程序自由運行,直到命中斷點。

但是等待 - 在此期間,您的主線程已經跳入遠方,您失去了控制權。你不能爲此設置一個斷點,因爲每當遇到任何斷點時你的程序都會被gdb掛起。

簡而言之,它在阿森納的一個正確的痛苦。

您可以在Eclipse中輸入gdb命令。這有點幫助,因爲你可以做一些事情,比如設置線程特定的斷點,並將gdb設置爲非停止模式和後臺異步模式。這些總比沒有好,但根據我的經驗,並沒有完成整個工作。更糟糕的是,Eclipse似乎完全不知道它們(我可能已經過時),因此您只能手工輸入命令。在這種情況下,您最好不要在Eclipse中運行。

我建議你看看this。一個好的方法是在所有線程的開始處放入一個循環,其中循環條件是一些永遠不會改變的變量。這樣,當創建線程時,可以切換到它,設置所需的任何斷點,然後自己更改循環變量的值,以便在繼續線程時退出循環並運行到斷點。

- EDIT--

似乎我過時了。看看this。看起來Eclipse現在知道不間斷模式,並且線程特定的斷點。那些在每個線程中都加入了一個catch-at-start睡眠循環(也許Eclipse現在可以解決這個問題)將使它可以容忍調試線程。