問題タブ [sqlcipher-android]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
1271 参照

android - スタック トレースしか利用できない場合に Android クラッシュをデバッグする方法

ときどきクラッシュするアプリがあり、その理由をデバッグしようとしています。クラッシュが発生しているライブラリへのすべての呼び出しをラップする logcat にデバッグ情報を追加しましたが、残念ながら最後にクラッシュが発生したときはフィールドにあり、デバイスが logcat を表示できる場所に到達するまでにまだ残っていたのはスタックトレースだけでした。

コード内でクラッシュが発生した場所を特定するのに苦労しており、コード内でスタック トレース番号を (たとえば) 行番号に変換するためのヒントを探しています。

クラッシュは明らかに「JavaBridge」で発生し、上位 17 フレーム (0 ~ 16) はリンク先の共有オブジェクト ライブラリ「libsqlcipher.so」で発生しました。最初の 16 フレームのそれぞれには、「#00 pc 0000000000088cf0」などのアドレスしかありませんが、17 番目のフレームには「_ZN9sqlcipher7compileEP7_JNIEnvP8_jobjectP7sqlite3P8_jstring+184」というマングルされた名前があります。どの行か確認してください。18 番目のフレームは別のアドレスで、私のプロジェクト ディレクトリの下にある「oat/arm64/base.odex」を参照しています。compile() はアプリから直接呼び出されないため、スタック トレースがここで終了する理由がわかりません。

完全なスタック トレースは次のとおりです。

明らかに、共有オブジェクト ライブラリのフレームには行番号が付いていませんが、指定されたアドレスから、自分のコードでクラッシュが発生した行を見つけるにはどうすればよいでしょうか?

更新: すべての呼び出しを sqlcipher ライブラリにラップし、呼び出しに関する詳細を SD カード記録してから、呼び出しを続行しました。数日後、次のクラッシュが発生しましたが、すぐにわかりました... クラッシュが発生したとき、これらの呼び出しはいずれもアクティブではありませんでした (2 秒以上!)。

また、Android Studio でアプリケーションをデバッグして、上記の数字が何に対応するかを把握しようとしましたが、... Android Studio は各スタック フレームの PC を一覧表示せず、上記のネイティブ コードにステップインすることさえしません。 「強制ステップイン」で。