1

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

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

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

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

07-16 10:40:03.103  2967  6420 F libc    : Fatal signal 7 (SIGBUS), code 2, fault addr 0x7007a1b000 in tid 6420 (JavaBridge)
07-16 10:40:03.229 15040 15040 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
07-16 10:40:03.229 15040 15040 F DEBUG   : Build fingerprint: 'google/angler/angler:7.1.2/NXGXXB/XXXXXXX:user/release-keys'
07-16 10:40:03.229 15040 15040 F DEBUG   : Revision: '0'
07-16 10:40:03.229 15040 15040 F DEBUG   : ABI: 'arm64'
07-16 10:40:03.230 15040 15040 F DEBUG   : pid: 2967, tid: 6420, name: JavaBridge  >>> com.michael.test <<<
07-16 10:40:03.230 15040 15040 F DEBUG   : signal 7 (SIGBUS), code 2 (BUS_ADRERR), fault addr 0x7007a1b000
07-16 10:40:03.230 15040 15040 F DEBUG   :     x0   290ccf38feaeb8f6  x1   0000000000000000  x2   0000006fdbbb0158  x3   0000000000000008
07-16 10:40:03.230 15040 15040 F DEBUG   :     x4   00000000000000a5  x5   0000000000000001  x6   0000000000000001  x7   0000007022acb074
07-16 10:40:03.230 15040 15040 F DEBUG   :     x8   0000000000000000  x9   0000000000000002  x10  0000000000000001  x11  0000000000000000
07-16 10:40:03.230 15040 15040 F DEBUG   :     x12  0000007004654640  x13  0000000000001a40  x14  000000000000000c  x15  0000000000000000
07-16 10:40:03.230 15040 15040 F DEBUG   :     x16  0000007007d714e8  x17  0000007022ac9464  x18  0000000000ffffeb  x19  0000007007a1b000
07-16 10:40:03.230 15040 15040 F DEBUG   :     x20  0000007007d71000  x21  00000070059057f4  x22  00000070059055f8  x23  0000006fdbd73788
07-16 10:40:03.230 15040 15040 F DEBUG   :     x24  0000007007ce1c60  x25  0000007007ce62c0  x26  0000000000000000  x27  0000007005905890
07-16 10:40:03.230 15040 15040 F DEBUG   :     x28  0000000000000000  x29  0000007005906df8  x30  0000007007b3236c
07-16 10:40:03.230 15040 15040 F DEBUG   :     sp   00000070059055c0  pc   0000007007afecf0  pstate 0000000080000000
07-16 10:40:03.249 15040 15040 F DEBUG   : 
07-16 10:40:03.249 15040 15040 F DEBUG   : backtrace:
07-16 10:40:03.249 15040 15040 F DEBUG   :     #00 pc 0000000000088cf0  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #01 pc 00000000000bc368  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #02 pc 00000000000bc9d8  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #03 pc 00000000000da90c  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #04 pc 00000000000de684  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #05 pc 000000000011c708  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #06 pc 000000000011c840  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #07 pc 000000000011d934  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #08 pc 000000000011e378  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #09 pc 0000000000093478  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #10 pc 0000000000093ab4  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #11 pc 00000000000efff4  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #12 pc 000000000010b070  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #13 pc 0000000000110bd8  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #14 pc 0000000000111090  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #15 pc 0000000000140eb0  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so
07-16 10:40:03.250 15040 15040 F DEBUG   :     #16 pc 00000000001481ec  /data/app/com.michael.test-1/lib/arm64/libsqlcipher.so (_ZN9sqlcipher7compileEP7_JNIEnvP8_jobjectP7sqlite3P8_jstring+184)
07-16 10:40:03.250 15040 15040 F DEBUG   :     #17 pc 000000000006482c  /data/app/com.michael.test-1/oat/arm64/base.odex (offset 0x53000)

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

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

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

4

1 に答える 1