JNI 本机代码中的分段错误 (Android)
Segmentation fault in JNI native code (Android)
我在 Haskell 中有一个库,我通过 FFI 和 Swig 为它生成了包装器。我还设法交叉编译了一个可以从 Java 加载的共享库。包装库包含一些函数和这些函数的 input/output 类型。
在我的 Arch 机器上,我可以使用来自 Java 的库。但是,当我现在在 Android 上尝试它时,它会出现段错误。经过一番调查,似乎如果输入对象没有字段,它有时会起作用。我认为这是数据编组的问题。但是很难调试。在崩溃日志中我发现这个
W/linker ( 4783): libAPIsJava.so has text relocations. This is wasting memory and prevents security hardening. Please fix.
还有这个
--------- beginning of crash
F/libc ( 4783): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x200019 in tid 4783 (api.flic.io.api)
I/Icing ( 1689): Indexing 17F83E8EEF17AFFA030207AF16B79084CE236092 from com.google.android.googlequicksearchbox
I/DEBUG ( 357): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 357): Build fingerprint: 'google/shamu/shamu:5.1/LMY47D/1743759:user/release-keys'
I/DEBUG ( 357): Revision: '33696'
I/DEBUG ( 357): ABI: 'arm'
I/DEBUG ( 357): pid: 4783, tid: 4783, name: api.flic.io.api >>> app.api.flic.io.api <<<
I/DEBUG ( 357): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x200019
I/DEBUG ( 357): r0 af2033d4 r1 af2033d0 r2 00000000 r3 00200018
I/DEBUG ( 357): r4 a2bbf950 r5 af2033dc r6 af2029a0 r7 af202fff
I/DEBUG ( 357): r8 a2af06b0 r9 00200019 sl af2033c8 fp af2030a4
I/DEBUG ( 357): ip b6e627dc sp bec8eee0 lr af2029b0 pc a0b4d248 cpsr 800d0010
I/DEBUG ( 357):
I/DEBUG ( 357): backtrace:
I/DEBUG ( 357): #00 pc 01be4248 /data/app/app.api.flic.io.api-2/lib/arm/libAPIsJava.so
然而,发出arm-linux-androideabi-addr2line -f -e libAPIsJava.so 01be4248,输出为
$a
/tmp/ghc27404_0/ghc27404_3.bc:?
这没什么用。我真正想要的是 运行 带有 valgrind 的应用程序,这样的事情可能吗?
更新:我现在已经安装了 valgrind 并尝试 运行 该应用程序。但是我得到
valgrind: mmap(0x108000, 42770432) failed in UME with error 22 (Invalid argument).
valgrind: this can be caused by executables with very large text, data or bss segments.
这似乎是不行的。
原来问题出在我的交叉编译工具链 (https://github.com/neurocyte/ghc-android) 的 hsc2hs 脚本中有一个错误。它被实现为一个包装器,调用 /usr/bin/hsc2hs 带有一些标志。但是,它没有使用 --cc 和 --ld 标志,因此生成的 .hs 文件针对我的构建主机。通过添加这些标志,一切都很好!
我在 Haskell 中有一个库,我通过 FFI 和 Swig 为它生成了包装器。我还设法交叉编译了一个可以从 Java 加载的共享库。包装库包含一些函数和这些函数的 input/output 类型。
在我的 Arch 机器上,我可以使用来自 Java 的库。但是,当我现在在 Android 上尝试它时,它会出现段错误。经过一番调查,似乎如果输入对象没有字段,它有时会起作用。我认为这是数据编组的问题。但是很难调试。在崩溃日志中我发现这个
W/linker ( 4783): libAPIsJava.so has text relocations. This is wasting memory and prevents security hardening. Please fix.
还有这个
--------- beginning of crash
F/libc ( 4783): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x200019 in tid 4783 (api.flic.io.api)
I/Icing ( 1689): Indexing 17F83E8EEF17AFFA030207AF16B79084CE236092 from com.google.android.googlequicksearchbox
I/DEBUG ( 357): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG ( 357): Build fingerprint: 'google/shamu/shamu:5.1/LMY47D/1743759:user/release-keys'
I/DEBUG ( 357): Revision: '33696'
I/DEBUG ( 357): ABI: 'arm'
I/DEBUG ( 357): pid: 4783, tid: 4783, name: api.flic.io.api >>> app.api.flic.io.api <<<
I/DEBUG ( 357): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x200019
I/DEBUG ( 357): r0 af2033d4 r1 af2033d0 r2 00000000 r3 00200018
I/DEBUG ( 357): r4 a2bbf950 r5 af2033dc r6 af2029a0 r7 af202fff
I/DEBUG ( 357): r8 a2af06b0 r9 00200019 sl af2033c8 fp af2030a4
I/DEBUG ( 357): ip b6e627dc sp bec8eee0 lr af2029b0 pc a0b4d248 cpsr 800d0010
I/DEBUG ( 357):
I/DEBUG ( 357): backtrace:
I/DEBUG ( 357): #00 pc 01be4248 /data/app/app.api.flic.io.api-2/lib/arm/libAPIsJava.so
然而,发出arm-linux-androideabi-addr2line -f -e libAPIsJava.so 01be4248,输出为
$a
/tmp/ghc27404_0/ghc27404_3.bc:?
这没什么用。我真正想要的是 运行 带有 valgrind 的应用程序,这样的事情可能吗?
更新:我现在已经安装了 valgrind 并尝试 运行 该应用程序。但是我得到
valgrind: mmap(0x108000, 42770432) failed in UME with error 22 (Invalid argument).
valgrind: this can be caused by executables with very large text, data or bss segments.
这似乎是不行的。
原来问题出在我的交叉编译工具链 (https://github.com/neurocyte/ghc-android) 的 hsc2hs 脚本中有一个错误。它被实现为一个包装器,调用 /usr/bin/hsc2hs 带有一些标志。但是,它没有使用 --cc 和 --ld 标志,因此生成的 .hs 文件针对我的构建主机。通过添加这些标志,一切都很好!