是否可以在 Android Studio 中调试 C/C++?

Posted

技术标签:

【中文标题】是否可以在 Android Studio 中调试 C/C++?【英文标题】:Is it possible to debug C/C++ in Android Studio? 【发布时间】:2015-04-03 03:42:41 【问题描述】:

我正在编写一个 android 应用,其中包含与 Java 代码一起编译的 C/C++ 代码。我的应用程序在执行本机代码期间崩溃。

有没有办法像使用 Java 源代码一样单步执行 Android C/C++ 源代码并检查变量?

我不一定要在 Android Studio 中寻找一种方法来逐步浏览源代码。这显然是理想的解决方案,但是,如果我在从 Studio 启动应用程序后需要使用外部工具,那很好。我希望能够逐行执行并检查变量。

Android Studio 1.0.2 Android NDK r10d

编辑:源于“使用带有 ADT 插件的 Eclipse”的即时响应,让我添加更多要求。 该项目最初是一个 Eclipse ADT 项目。但是,我现在已经迁移到 Android Studio。我的项目现在是使用 Gradle 构建的,我的项目目录结构反映了这一点。我愿意使用Eclipse;我愿意更改我的项目结构以便从 Android Studio 恢复到 Eclipse。如果有办法在 Eclipse 中打开 Android Studio 项目并进行调试,请详细说明过程。

【问题讨论】:

我建议您使用 ADT 插件切换到 Eclipse 【参考方案1】:

[更新]

截至 2015 年 7 月,Android Studio 确实支持 NDK。

您可以在this link 上了解更多信息。


[旧] Android Studio 尚不支持 NDK。

当我们必须处理 NDK 时,唯一的解决方案就是使用 Eclipse。

编辑

我们基本上保留带有 NDK 功能(在我们的例子中是地图)的 Eclipse 项目和带有其他(非地图)功能的 Gradle 项目。因此,所有必须使用 NDK 完成的事情,我们都在 Eclipse 中完成,然后将更改包含到 Gradle 项目中。

更准确地说,在/src/main/ 目录中,我们创建了另一个名为jniLibs 的目录,并将编译后的*.so 文件放入特定于架构的文件夹(armeabi-v7a、armeabi、x86...)中。然后在Gradle项目的主类里干脆加了一行

static 
    System.loadLibrary("OurNDKLibName");

您只能在每个项目中添加此行一次。也许我错了,但我们这样做没有任何问题。

【讨论】:

你能详细说明一下吗?我正在寻找该过程的具体细节。 还有 VSDroid 支持从 Visual Studio 调试原生 Android 代码。它是免费提供的,但已经将近一年没有更新了。它仍处于测试阶段并且“按原样提供” 我在 Mac 上开发。没有适合我的 Visual Studio。 @sandalone 所以你正在 Eclipse 中开发一个 C++ 库,然后用 Gradle 导入它?虽然这有点帮助,但它并没有提供在调试 Android 应用程序时单步执行 C++ 代码的方法。 @DirtyBeach 我不知道如何使用 Android Studio 做到这一点。查看此视频software.intel.com/en-us/videos/… 并让我知道它是否有效。我也会感兴趣的。【参考方案2】:

截至 1.3+ 版预览版 Android Studio 支持 C++ 调试,引用 Android M Developer Preview & Tools:

最值得注意的是我们的 Android NDK 和游戏开发人员迫切需要的一项功能:用于 C/C++ 代码的代码编辑和调试。 Android Studio NDK 插件基于 JetBrains Clion 平台,为 C/C++ 代码和 Java 代码提供重构和代码完成等功能。 Java 和 C/C++ 代码支持已免费集成到 Android 应用开发者的一种开发体验中。

【讨论】:

我已经安装了这个版本,但不知道如何调试本机代码。我可以在我的项目中看到 cpp 文件,但无法设置任何断点或进入 jni 调用。有人设法做到了吗? 我认为他们尚未发布包含 C++ 支持的 Android Studio 更新,但根据公告,他们计划在 1.3 中发布(仍处于预览状态并将更新)。 ***.com/questions/34959013/…【参考方案3】:

isn't wasn't 不太好用。

hello-jni fails 失败:

Starting LLDB server: run-as com.example.sample 
/data/data/com.example.sample/lldb/bin/start_lldb_server.sh 
    /data/data/com.example.sample/lldb 
        /data/data/com.example.sample/lldb/tmp/platform.port1442695333842 "lldb 
    process:gdb-remote packets"
Error while launching debug server on device: 
    com.android.tools.ndk.run.DebuggerContext$StartServerException: 
        java.lang.IllegalStateException: Failed to read platform port 
            /data/data/com.example.sample/lldb/tmp/platform.port1442695333842

我正在使用 1.4RC1

compileSdkVersion 23
buildToolsVersion "23.0.1"

还有@Gerry 提到的“app-native”运行配置。它几乎就在那里,但我在我的应用程序的私有数据文件夹中找不到lldb 目录的踪迹。我确实在从那里链接的lib 目录中找到了一个 400kb gdbserver,旁边还有我自己的*.so。不幸的是,从 1.3 升级到 1.4 时,使用 gdb 而不是 lldb 进行调试的选项已经消失。 NDK 10e 在ndk\prebuilt\android-arm\gdbserver 中提供了一个 400kb gdbserver 二进制文件(我猜)。 9 月 15 日更新了 gdb 调试方法 https://github.com/mapbox/mapbox-gl-native/wiki/Android-debugging-with-remote-GDB。这比 logcat 调试 IMO 更难,但是一个当前的话题,很抱歉这么消极,但我不相信 lldb 真的有效。

我已经运行了 hello-jni 并得出了相同的结论。

因此,在回答您的问题时,尚无法在 Android Studio 中调试 C/C++。抱歉,这不是您所希望的答案,我希望用相反的确凿证据证明是错误的,但就在这里,现在,没有机会!

更新我提出了一个issue,在那里我得到了一部手机的修复。

UPDATE2 说得太早了,毕竟它是实验性的,但我偶尔会连接失败,如果不是总是会出现乱序步进和断点的无意义参数值。我只是设置了一个没有触发但 logcat 显示它应该触发的条件断点。最初我认为这是我的逻辑错误,但它更深入。

简单地打断点非常有用,但距离 Java 调试或 Vis Studio C++ 调试还有一百万英里。

UPDATE3 回到稳定版 1.3.1,因为 canaray 频道版本在每次击键时都会暂停厕所休息。虽然本机调试版本至少会使用我的“固定”手机启动,但即使在 hellojni 或稍微扩展的版本中也不会遇到断点,以提供更多机会。我现在习惯了 logcat,但在 Android、NDK 和 Eclipse 方面有更好的调试经验。更复杂的解决方案也更容易破解,但至少它有效

【讨论】:

@TinyGiant 好的,措辞有点偏离,但如果您阅读最后一段,它问题的答案。 @AlexCohn 也许适合你,但对我来说,这不应该。我应该冻结这个答案,直到我有机会再次尝试 hellojni。 查看您的第二次更新,我完全同意您的发现。有 Visual Studio 或 Java 经验的人应该降低他们的期望。原生调试还不是 100% 可靠;通常需要三次尝试才能开始,有时 AS 需要在其中一次失败的尝试中强制退出(顺便说一下,我在 Mac OS 上,它的行为可能与 WINdows 非常不同)。关于无意义的帧值,这主要发生在应用程序在 Java 中崩溃时。我从未尝试过条件断点。【参考方案4】:

是的,Android Studio 至少在 Android Studio 1.5.1 和 android-ndk-r10e 中支持 C++ 调试。

在过去,您必须编写 make 文件 Android.mkApplication.mk 才能在 Android Studio 中构建 C++ 代码。你不再需要它们了。只要你把它们放在 jni 文件夹下,gradle 就能把它捡起来编译。您应该会看到类似以下内容:

并且还允许您设置断点并对其进行调试。

您应该关注this step-by-step tutorial 并了解更多信息。并阅读有关文档here 的更多信息。我上传了一个完整的工作示例,您可以在GitHub 上下载并试用它。


【讨论】:

【参考方案5】:

使用来自 tools.android.com 的 Android Studio 1.4,可以进行调试。当您打开/创建一个包含 C++[jni] 代码的项目时,Android Studio 会创建一个新配置,例如 $(module_name)-native

我会选择此配置、同步 gradle、构建、设置断点等并使用 Android Studio 运行它。等了好久,我的调试器连接上,app坏了[我觉得你也可以在这个时候设置断点];这个断点不在我设定的断点处,我在 android studio 中让它走,我的断点被击中。希望这会有所帮助Some samples 应该可以与 android 调试器一起使用

【讨论】:

【参考方案6】:

是的!可以在 android studio 中调试本机代码。从更新开始,Android Studio 2.2+ 支持用于调试本机代码的内置工具。

【讨论】:

以上是关于是否可以在 Android Studio 中调试 C/C++?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不使用 android studio 中的任何 USB 电缆的情况下通过 wifi 进行调试? [复制]

Android Studio 没有链接到华为调试设备。设备可以启动,但没有出现在设备选择列表中

使用 Android Studio 调试 Android NDK

使用Android Studio调试C ++库

使用 Android Studio 调试 C++ 库

在 android studio 中使用设备调试时,Android Logcat 为空