如何在 NDK 原生代码中获取断点并在 Android Studio 中调试原生代码?

Posted

技术标签:

【中文标题】如何在 NDK 原生代码中获取断点并在 Android Studio 中调试原生代码?【英文标题】:How to get breakpoint in NDK native code and debug native code in Android Studio? 【发布时间】:2015-04-20 13:18:54 【问题描述】:

我正在使用 NDK 开发 android 应用程序。我有两个项目。一个是我的原生库,它使用 NDK 并生成 .so 文件。

我正在使用 Android Studio,但禁用了自动构建并使用 ndk-build 启用了构建。我使用的是 Windows 7。

现在,在生成 .so 文件后,我将它们复制到我的主应用程序项目中,该项目还使用 ndk-build 编译 JNI 函数,我在其中调用我的库的函数。我希望我在这一点上是干净的。如果没有,我会根据要求提供更多详细信息。

现在我正在使用 Android Studio 在设备中运行我的应用程序,我可以在 java 代码中设置断点并调试该代码,但我无法调试 JNI 调用以及我在单独项目中拥有的本机代码。我需要在我的库代码中进行调试。那么有什么办法可以实现呢?

我看过 VisualGDB,但它是付费的。所以让我知道是否有任何替代方案可以完全满足我的调试要求。我搜索了很多但没有得到任何具体的解决方案。

我可以在 Android Studio 中看到附加到 android 进程的选项,我可以在其中看到我正在运行的设备,但我不确定如何使用它,因此我可以通过本机库代码进行调试(它位于单独的项目中,没有任何活动)。

如果需要更多细节,请告诉我

【问题讨论】:

AFAIK,在 android studio 中无法进行原生调试。顺便说一句,如果您在问题中添加一些格式并使其不那么“密集”,就会有更多人阅读它。 @JonasCz 其实就是现在,看下面妹子的回答 @Premal,我看到没有公认的答案,在从第二个项目的一个项目中调试 .so 时,是否有任何建议的解决方案有效? 【参考方案1】:

在 Android Studio 2.0 预览中,过程有点不同(我认为更容易):

    安装“LLDB”:进入工具->Android->SDK 管理器,然后进入“SDK 工具”选项卡并确保选中“LLDB”(通常在列表末尾附近) 选择“Debug”变体:在AS左下角,点击“Build Variants”,默认的debug变体名为“Debug” 选择原生配置:运行按钮左侧(绿色三角形),默认原生配置称为“app-native” 设置断点 通过点击运行按钮右侧的小错误在调试中启动您的应用

如果不起作用,请检查您的本机配置是否选择了调试类型“混合”:在播放按钮右侧,单击小三角形,选择“编辑配置”,选择您的“应用程序原生”配置,进入“调试器”选项卡并选择“调试类型:混合”。

【讨论】:

顺便说一句,如果您尝试使用 graddle 2.9 及更高版本,您可能会在编译时遇到 空指针异常。如果是这种情况,只需进入 [首选项] -> [构建、执行、部署] -> [即时运行] 并检查即时运行是否已停用。 Gradle 2.9 的即时运行存在问题。 哈哈哈哈哈哈哈哈!!!对不起。信不信由你,第 1 步是我错过的!现在它可以工作了(Studio 2.0 Beta 4,Gradle 2.10,不是实验版)。谢谢 !非常!这应该是公认的答案! 很高兴看到它有帮助:) 有一天我的调试随机停止工作。解决方案是将调试类型从“Auto”设置为“Dual”(Android Studio 3.0.2)。 @CJxD 你是救生员。谢谢!【参考方案2】:

Android Studio 1.3+ 支持原生调试。

要设置它,请按以下步骤操作:

    修改您的 gradle-wrapper.properties、local.properties 和两个 build.gradle 文件,如 this guide 所示 同步分级

    创建并选择新的构建配置:

    点击运行按钮旁边的下拉菜单)-> 编辑配置,点击加号,选择Android Native,在右侧填写选项(我在native debugger tab中使用LLDB),应该设置好了。

    在 C++ 中设置断点

    点击调试按钮并耐心等待(有时调试器需要一段时间)

我已经能够使用 Android Studio 1.3(稳定通道)在 Lubuntu 14.04 下调试原生代码。虽然其他人据说在 Windows 下成功了,但我 haven't been able to debug 原生在 Windows 8.1 中(我尝试过使用 Android Studio 1.3、1.3.2 和 1.4 预览版 3)。

更新 Android Studio 1.4 Beta 刚刚问世。我对其进行了测试,并且能够在 Windows 8.1 上进行原生调试。

【讨论】:

对我来说一切似乎都很好,没有错误,调试器附加在控制台中。但是我的断点根本没有被击中。我的断点位于我的 Activity onCreate 中调用的一段代码中。原来在 Android Studio 1.3 中有一个错误,断点不会在应用程序启动时受到影响。在 Canary 频道中将我的 IDE 升级到 1.4 测试版,它工作正常。【参考方案3】:

我能够设置断点并单步执行本机代码,但前提是满足以下所有条件:

    生成的本机库 .so 文件保留了它们的调试符号 已提供源(请参阅“库属性”菜单) 我将运行/构建配置设置为使用本机调试器(如 here 所述)

它现在在 Android Studio 1.5 中为我工作,使用 Gradle Experimental Plugin

【讨论】:

【参考方案4】:

本地代码中的断点不起作用的另一个检查点:

删除android:extractNativeLibs="false" 行或在AndroidManifest.xml 中将其设置为true

extractNativeLibs="false" 偶尔会导致 1 或 2。

    安装将失败并显示消息“INSTALL_FAILED_INVALID_APK” 本机代码中的断点不起作用

【讨论】:

【参考方案5】:

如果在您尝试了所有方法后您的本地断点仍然无法命中,并且您的本地库已被多个 AS 项目引用,那么有一个简单的解决方案。

只需在 setting.gradle 和 build.gradle 中重命名您的原生库

之前:

//in setting.gradle
include ":myNativeLib"
project(":myNativeLib").projectDir = new File("...")
//in app's build.gradle
api project(':myNativeLib')

之后:

//in setting.gradle
include ":myNativeLib2"
project(":myNativeLib2").projectDir = new File("...")
//in app's build.gradle
api project(':myNativeLib2')

【讨论】:

以上是关于如何在 NDK 原生代码中获取断点并在 Android Studio 中调试原生代码?的主要内容,如果未能解决你的问题,请参考以下文章

本机代码中的断点无法在 Android Studio 上命中 [重复]

Android NDK/JIN 从入门到精通

如何定位Android NDK开发中遇到的错误

如何从eclipse环境中获取NDK路径?

NDK调试,无法设置断点

如何在反应原生网格图像查看器中传递动态获取的图像数组数据,并在反应原生中使用标题