2015-09-10 2 views
9

私はAndroid Studioのlldbを使ったネイティブデバッグからアンドロイドネイティブアプリをデバッグしようとしています。
私のネイティブアプリには、Android Studioとコンパイルされた別のlibother.soによってコンパイルされて実行されるlibmain.soが1つ含まれています。デバッグ時にlibmain.soではブレークポイントを設定できますが、libother.soでは設定できません。
共有オブジェクトはどちらも削除されますが、Android Studioではlibmain.soの削除されていないバージョンについてlldbに知らせています。私はlibother.soのために同じことをしたい。LLDB:シンボルファイルを追加しますか?

lldbにローカルマシン上のストリップされていないファイルからシンボルをロードするためには、どのようなコマンドが必要ですか?
私はimage listを行うと、私はその地元のストリップされていないバージョンへのポイントのパスで、メインの.soを参照してください。私はどのように /var/folders/3w/5nr95lxx3qvdm2ylb8c8b7500000gn/T/./lldb/module_cache/remote-android/.cache/B5F32653-0000-0000-0000-000000000000/libother.so

のようなパスと

/Users/username/Projects/gow/android/AppName/app/build/intermediates/binaries/debug/arm7/obj/armeabi-v7a/libmain.so

と第二の.so lldbにアンストライプされたバージョンlibother.soを見つけさせますか?
image addtarget symbols addを試しましたが、動作しませんでした。

+0

あなたはGradleのでアプリをビルドしてください:

は、このコマンドは(例えばlldb.cmd)を提出し、このようlldb開始するために保存することができ、各デバッグセッションの開始後、それを入力して回避するために?もしそうなら、ビルドファイルを共有できますか?また、Android.mkファイルを共有してください。 –

+0

私はgradleで構築します。ビルドファイルはTeapotサンプル(https://developer.android.com/ndk/samples/sample_teapot.html)に付属のものと同じです。唯一の違いは私のプロジェクトでは "jniLibs"というフォルダがあることですgradleはこのフォルダを見つけて、その中の.soをapkに追加します。 .soを構築するためのAndroid.mkも、Android Studioのサポートの前にndkを使ってビルドするために使用された標準のものです。それはclangとC++ _ static(ここで追加するには大きすぎます)を使用します。私は最新のものを使用していますNDK – shoosh

+0

あなたは窓でデバッグしていますか?あなたが提供したパスはAndroidからのものです。 NDKにはまだいくつかの既知のバグがあります。 LLDBブレークポイントでのデバッグがWindows上で常に機能するとは限りません。これを実行すると、一時的な回避策としてGDBのデバッグに切り替えることができます。 –

答えて

2

は設定「target.sourceマップ」を使用

(lldb)設定リストtarget.sourceマップ
ソースマップ - との間の位置の変化を追跡するために使用されるソースパス 再マッピングソースファイル (ビルドされた場合)、および現在のシステム上に存在する場所 これは、デュプルの配列で構成されています。各ダプルの最初の要素は、 が作成されたときに ファイルへのパスの一部(ルートで始まります)で、2番目の要素は元のビルド階層の残りローカルシステムに根ざしています。配列 の各 要素が順番にチェックされ、最初に一致したものが勝ちます。

下にコピーされ

建物環境が /build_srcとthe.dSYMファイル(記号)の下にある
settings set target.source-map /build_src /source 

すなわち/source

EDIT:

バイナリは、多くの場合、内蔵された後に削除されますリリースにパッケージ化されています。ビルドシステムがストリップされていない実行可能ファイルを保存した場合、この実行可能ファイルへのパスは、キーDBGSymbolRichExecutableを使用して提供することができる

あなたはUUID値を与え、特定のキーとのplistを返すことが期待 ですされるシェルコマンドを書くことができ

このバイナリは のどこにあるかを指定します。

あなたは使用してシェルスクリプトを有効にすることができます。

% defaults write com.apple.DebugSymbols DBGShellCommands /path/to/shellscript 

あなたのシェルスクリプトは "23516BE4-29BE-350C-91C9-F36E7999F0F1" のようなUUID文字列値で呼び出されます。シェルスクリプトは、次の形式で のplistで応答することができます。詳細は

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
"http://www.apple.com/DTDs/PropertyList-1.0.dtd";> 
<plist version="1.0"> 
<dict> 
     <key>23516BE4-29BE-350C-91C9-F36E7999F0F1</key> 
     <dict> 
       <key>DBGArchitecture</key> 
       <string>i386</string> 
       <key>DBGBuildSourcePath</key> 
       <string>/path/to/build/sources</string> 
       <key>DBGSourcePath</key> 
       <string>/path/to/actual/sources</string> 
       <key>DBGDSYMPath</key> 
       <string>/path/to/foo.dSYM/Contents/Resources/DWARF/foo</string> 
       <key>DBGSymbolRichExecutable</key> 
       <string>/path/to/unstripped/exectuable</string> 
     </dict> 
     <key>A40597AA-5529-3337-8C09-D8A014EB1578</key> 
     <dict> 
       <key>DBGArchitecture</key> 
       <string>x86_64</string> 
       ..... 
     </dict> 
</dict> 
</plist> 

を参照してください。

http://lldb.llvm.org/symbols.html

https://www.mail-archive.com/[email protected]/msg01142.html

EDIT 2:

ターミナルコマンドを実行可能ファイルのビルドUUIDを印刷する

完全のために
$ xcrun dwarfdump --uuid <PATH_TO_APP_EXECUTABLE> 

source

+0

私は.dSYMファイルを持っていません。ちょうど解除されていない共有オブジェクトです... – shoosh

+0

私の答えの編集を参照してください – Pat

+0

これはいいです!、私はどのように私の.so aprioriのUUIDを設定/取得するのですか? – shoosh

1

、私がやってしまったことは
ある - libmain.so
のAndroid.mkにLOCAL_LDFLAGS-Wl,--build-id=sha1を追加 - /Users/username/Projects/gow/android/AppName/app/build/intermediates/binaries/debug/arm7/obj/armeabi-v7a/からストリップされていない共有オブジェクトにシンボリックリンクを追加。

AndroidのスタジオのLLDBが盗まれていない.soを見つけ、シンボルを正しく表示でき、libmain.soコードにブレークポイントを追加することができました。

2

このスレッドの回答はMacOSX固有のようです。私はLinuxを使用しているので、これらの答えはそれほど役に立ちませんでした。しばらくして私はそれを理解しました、そしてここでは非常に簡単な解決策です。あなたが行う前に、次のコマンドを実行しなければならない「プロセスをアタッチ」:

settings set target.exec-search-paths /path/to/directory/with/unstripped/library/on/host 

この設定lldbに問題ライブラリの正しいバージョンを見つけることがありません。

Androidスタジオの最新バージョンは、外部ライブラリに問題がありません(実際には、同じテクニックを使用して、すべてのライブラリを「内部」と「外部」の両方に正しいパスに設定しています。 Gradleで再構築)。しかし、スタンドアロンのlldbを使用すると、これは非常に便利です。

./lldb -S lldb.cmd 
+0

これはAS 2.2.2(またLinuxで動作している)では動作しないようです。 'lldb'はデバッグシンボルを含んでいない' .lldb/module_cache/... '('イメージリスト 'にあります)に格納されているライブラリを使用しています。私はexec-search-pathを 'Run/Debug Configuration'に' LLDB Startup Commands'の下に置いています。このディレクトリはデバッグシンボルを持つ共有ライブラリを含んでいるので、パス自体は '{abs_path_to_project}/app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a'を指しています。私がここで間違っていることに関するアイデアは? –

+0

私は 'LLDB起動コマンド'について知らず、決してそれを使用しませんでした。手動で入力するだけでいいですか?あなたの '画像リスト 'にライブラリが表示されますか? –

+1

申し訳ありませんが、私のライブラリはデバッグのために正しくビルドされていないことが判明しました。ありがとうございました。 –

関連する問題