2010-09-09 84 views
7

我從Android NDK r4瞭解到「ndk-gdb」的調試工具。現在我可以開始調試hello-jni示例(儘管存在一些問題)。帶有多個so庫的ndk-gdb

但是,對於我自己的Android應用程序,我有幾個這樣的庫可以使用,從大量的c/C++文件構建。我曾經使用ndk-build構建這些文件,然後將這些文件複製到$ PROJECT/libs目錄下,並且無需調試即可正常工作。但現在我想用ndk-gdb調試一個如此的lib。當我啓動ndk-gdb時,它抱怨沒有加載符號表。

我也複製所有這些文件到$ PROJECT/bin/ndk/local/armeabi(看起來像gdb試圖加載符號表的默認目錄)。而且,它仍然不起作用。

也許ndk-gdb無法跟蹤我的文件後,我複製它們?或者爲什麼它不能加載任何符號表,甚至在我將它們複製到$ PROJECT/bin/ndk/local/armeabi之後?

有沒有人遇到過這個問題?

非常感謝!

回答

10

我想你是將它們複製到錯誤的文件夾。較舊的NDK將文件複製到bin文件夾;新的將它們複製到obj文件夾,這就是它指向gdb來查找符號的地方。

此外,請確保您將預剝離的.so文件複製到obj文件夾,而不是複製到libs文件夾的相同文件:作爲構建過程的一部分,libs文件夾中的文件具有被剝奪了符號和調試信息。因此,您需要保留每個.so文件的兩個副本:一個來自要安裝在Android設備上的libs文件夾,另一個來自obj文件夾以便爲GDB安裝以獲取符號。

您可以不將調試文件複製到應用程序樹中的obj文件夾,而是將其他構建目錄obj /文件夾添加到gdb的符號搜索路徑。 ndk-build設置一個文件gdb.setup,其中包含一行以開頭的行,設置solib-search-path。您可以在該行上放置一個冒號分隔的路徑,該路徑包含所有目標obj/local/whatever文件夾,然後gdb將找到這些符號。

+0

非常感謝您的回覆!我明天會試試你的解決方案。而且,你能否提供更多關於NDK內部構建過程的文檔?就像「被剝光了」一樣,我從來沒有聽說過。 – MaratSafinWang 2010-09-25 09:16:44

+1

查看Unix命令「strip」:http://unixhelp.ed.ac.uk/CGI/man-cgi?strip - 如果您在工作時在Google上輸入「man strip」,請注意。對第一個鏈接感到驚訝。 :) – SomeCallMeTim 2010-09-27 02:53:04

+0

對於構建過程的其他步驟,這在NDK包的docs/OVERVIEW.TXT中有記錄:「最後一步將複製應用程序需要的剝離共享庫到應用程序的根項目目錄。」 – SomeCallMeTim 2010-09-27 02:56:34