【问题标题】:Segmentation fault in JNI native code (Android)JNI 本机代码中的分段错误(Android)
【发布时间】:2015-07-21 11:36:16
【问题描述】:

我在 Haskell 中有一个库,我通过 FFI 和 Swig 生成了包装器。我还设法交叉编译了一个可以从 Java 加载的共享库。包装的库包含一些函数和这些的输入/输出类型。

在我的 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.

这似乎是不行的。

【问题讨论】:

  • 我认为 valgrind 错误意味着 valgrind 构建不正确,请参阅bugs.kde.org/show_bug.cgi?id=138424#c13。可以用gdb吗?
  • 可能你做错了什么或者某处有错误,在任何一种情况下,如果没有对你正在做的事情的实际描述(你正在构建的代码)就很难取得进展,你是如何构建它的,你是如何构建 ghc 的,等等。)另一件可能有助于稍微缩小可能性的事情是尽可能尝试其他环境,比如 x86(模拟器)上的 Android 或 ARM 上的常规 Linux 发行版,如果你有它的硬件。
  • 这是一个相当长的构建过程。我使用 TH 生成 Haskell 库,为某些函数生成 FFI 导出,为 Haskell 数据类型生成 C++ 结构和可存储实例,为 C++ 代码生成 SWIG 文件,使用 automake 和 libtool 构建 Swig Java 库,静态链接整个 GHC运行时和所有 cabal 库,其中一些经过修改以填充 Bionic 中缺少的一些 glibc 函数,然后将其加载到 Android 应用程序中,登陆一个剥离的 62 MB .so 文件,我希望这只是一个小而难以发现的问题跨度>
  • 由于我已经能够使用我的工具链构建 Haskell 可执行文件,该工具链使用 Haskell 库并在设备上运行这些可执行文件,并在我的 PC 上使用 Java 库,因此我对构建过程有一定的信心。然而,Android 给我留下的信息很少。我会看看关于构建 valgrind 的帖子
  • 确实,如果我输出 memcheck-arm-linux 的入口点地址,它就是入口点地址:0x76f30 我关注了stackoverflow.com/questions/16450650/…。我在脚本中定义LD为/opt/ghc/android-14/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-ld,即GNU ld (GNU Binutils) 2.23.2

标签: android haskell android-ndk java-native-interface cross-compiling


【解决方案1】:

原来问题是我的交叉编译工具链 (https://github.com/neurocyte/ghc-android) 在其 hsc2hs 脚本中有一个错误。它被实现为一个包装器,它使用一些标志调用 /usr/bin/hsc2hs。但是,它没有使用 --cc 和 --ld 标志,因此生成的 .hs 文件以我的构建主机为目标。通过添加这些标志,一切都很好!

【讨论】:

    猜你喜欢
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多