【问题标题】:How can I effectively debug C code that's wrapped with JNI in Eclipse? (Android Dev)如何在 Eclipse 中有效地调试用 JNI 包装的 C 代码? (安卓开发)
【发布时间】:2011-06-18 06:43:36
【问题描述】:

我有一个段错误,但我完全不知道如何找到它。

提示?

【问题讨论】:

  • 我尝试关注此stackoverflow.com/questions/3902066/…,但我什至在有机会调用 logcat 之前就出现了段错误:/
  • 私有变量不能传递给原生函数。哦。
  • 简单且不那么快速的方法:尝试逐步隔离本机层中的调用,并检查哪个调用出错。另外,值得一试的是:/docs/NDK-GDB.HTML — 描述如何使用本机代码调试器

标签: java android c java-native-interface android-ndk


【解决方案1】:

您可以使用Android NDK Stacktrace Analyzer 获取导致崩溃的 C 函数的位置。

这些步骤在the wiki 上,但基本上你需要从 logcat 获取堆栈跟踪到一个文件 (adb logcat > mycrash.log),然后将你的库转储到一个文本文件,然后在它们两个上运行程序。这是我用来做很多事情的 shell 脚本:

#!/bin/sh
if test $# -lt 2 ; then
    echo "Extract readable stack trace from Android logcat crash"
    echo "Usage $0 lib.so crash.log"
    exit 1
fi
of=$(mktemp)
echo "Disassemble $1"
~/tools/android-ndk-r5/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-objdump -S $1 > $of
echo "Parse stack trace in $2"
~/bin/parse_stack.py $of $2

根据需要更改 Android NDK 和 parse_stack.py 文件的路径。

【讨论】:

  • 很高兴终于找到这样的东西。我已经厌倦了通过 gdbserver rigmarole 来获取段错误的跟踪信息。
  • 我刚刚向项目提交了一个补丁,其中显示了发生崩溃的代码段:code.google.com/p/android-ndk-stacktrace-analyzer/issues/…
  • 你在关注我吗 Jason LeBrun?哈哈。谢谢richq。太棒了。
【解决方案2】:

如何在 Eclipse 中有效地调试 Android JNI C/C++ 代码:

  1. 将您的项目设置为混合 Java、C 和 C++ 项目:

    http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-development/

  2. 设置您的项目以启用调试:

    http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-android-cc-debugging/#more-23

注意:该网站的作者在 Ubuntu 上使用了 Eclipse(Galileo)。我发现了一些差异 在 MacOS 上使用 Eclipse(Helios)(尤其是调试设置)。设置好之后,Eclipse 就可以很好地作为 JNI 开发的 IDE。

【讨论】:

  • 好的,他们可以让设置变得更困难吗?我仍然无法让它用于调试。
猜你喜欢
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多