Android NDK应用程序无法达到任何断点

 2023-01-20    386  

问题描述

我正在使用 https://www.youtube.com/watch? v = kjsc-lkugm8 尝试调试一个简单的ndk应用程序.我已经完成了视频中的所有操作,除了:

  1. 我在OS X 10.9.3而不是Windows上.
  2. 我不使用android:debuggable=true(导致eclipse认为它是错误)在androidmanifest.xml中,我已经设置了从Preferences->Android->NDK和Project Properties -> C/C++ Build Project Properties -> C/C++ Build in Checked Use default build command中设置NDK路径,并将其设置为ndk-build NDK_DEBUG=1 APP_OPTIM=debug.
  3. 我不使用x86 emulator,但是Samsung Duos S设备带有Android 4.0.4

但是,在我的情况下,视频中使用的闪电蛋白被击中.我正在尝试在第四天调试一个简单的NDK测试项目.已经研究了很多材料:

Android NDK应用程序无法达到任何断点

  1. Android本地开发套件食谱
  2. 一堆论坛和教程
  3. 视频

,但不能击中一个该死的断点.如果您可以做到这一点,请提供帮助.

推荐答案

以下是我为内部Android开发团队写的教程的摘录.其中的大部分来自此博客: http://mhandroid.wordpress.com/

重要说明:

  1. 我在我的Android工作中使用Linux(Ubuntu 12.04)环境.
  2. 我将ADT捆绑包用于Linux,构建:V22.2.1-833290(Eclipse IDE + Extras)
  3. 这些步骤是用于从Java活动调试到JNI共享对象.
  4. 我为本教程创建了测试项目,但在下面的说明中存在对这些项目的引用,但在此处不会发布.您需要一个现有的Android应用程序项目以及由Java代码调用的JNI共享对象.

项目设置

  1. 启用调试.

打开AndroidManifest.xml,选择”应用程序”选项卡,并设置 Debuggable=true .即使在用户模式下运行的设备上运行的设备,也将使应用程序可辩论.
4. 构建本地资源.从终端中,输入项目目录并输入:

ndk-build -B

您应该看到以下输出:

gdbserver:[Arm-linux-androideabi-4.4.4.3] libs/armeabi/gdbserver
gdbsetup:libs/armeabi/gdb.setup
compile ++拇指:debuggingtestjni
共享Library:libdebuggingtestjni.so
安装:libdebuggingtestjni.so => libs/armeabi/libdebuggingtestjni.so

  1. 清洁项目.在Eclipse菜单条中,选择项目→清洁.每当您更改/构建本地资源时,都可以执行此步骤.此步骤确保Eclipse将重建您的.APK.

本机调试设置

  1. 创建Java调试配置.我们需要创建一个调试配置,以踏入Java源代码.
  • 在Eclipse工具栏中,您会看到一个绿色错误.单击错误旁边的小箭头,然后选择”调试配置……”.
  • 双击左侧的树结构中的” Android应用程序”.这将为新的Android应用程序调试配置创建模板.
  • 在”名称:”字段中,将其命名为” debuggingtest java调试”,以确保您知道此配置专门适用于debuggingtest项目,并针对您的Java源.
  • “项目:”下方,单击”浏览…”按钮,然后选择” debuggingtest”.
  • 单击”应用”以保存您的更改.
  • 单击”关闭”.
  • 在Eclipse工具栏中,单击错误旁边的小箭头,然后选择”组织收藏夹……”.
  • 单击”添加…”
  • 选择” debuggingtest java调试”,然后单击”确定”.

您的新调试配置现已创建并添加到您的收藏夹中.您可以通过单击工具栏中的错误旁边的小箭头来访问您的收藏夹. ” debuggingtest java调试”应该位于列表的顶部.

  1. 运行ndk-gdb.
  • 在Eclipse工具栏中,单击错误旁边的小箭头,然后选择” debuggingtest java调试”.这将部署并安装debuggingtest.apk到您的已连接的Android设备并启动调试器.

  • 导航到终端中的debuggingtest项目目录,并键入以下内容:

    ndk-gdb

如果命令成功,则应看到以下内容:

GNU GDB 6.6
版权(C)2006 Free Software Foundation,Inc.
GDB是免费软件,由GNU通用公共许可证涵盖,您是
欢迎在某些条件下更改和/或分发其副本.
键入”显示复制”以查看条件.
GDB绝对没有保证.键入”显示保修”以获取详细信息.
该GDB被配置为” – horst = x86_64-linux-gnu -target = arm-felf-linux”.
(找不到调试符号)

如果您忘了在此步骤之前开始调试应用程序,则将获得以下内容:

错误:无法提取在设备/仿真器上应用的PID.
您确定应用程序已经启动吗?
考虑使用-Start或-launch =如果不是.
如果您的android.mk文件已畸形或包含$(INFO)块,则将获得以下内容:
CP:Target ./obj/local/armeabi/gdb.setup’ is not a directory /home/Dev/NDK/ndk-gdb: 639: cannot create start DebuggingTest/jni/Android.mk end DebuggingTest/jni/Android.mk ./obj/local/armeabi/gdb.setup: Directory nonexistent /home/Dev/NDK/ndk-gdb: 640: cannot create start DebuggingTest/jni/Android.mk end DebuggingTest/jni/Android.mk ./obj/local/armeabi/gdb.setup: Directory nonexistent start: invalid option: -x Try 开始-HELP’有关更多信息.

如果NDK-GDB已经在运行,您将获得以下内容:

错误:另一个调试会话正在运行,使用 – 杀死它.

在继续之前解决错误. NDK-GDB必须成功运行.

运行 ndk-gdb 不仅可以确保我们到目前为止做正确的一切,还可以创建 app_process , gdb.setup 和 libc.so 在我们项目的OBJ/local/armeabi/sub-directory中的文件.这些文件将在以后的步骤中需要.

  1. 停止调试.
  • 在您的终端中,类型 ctrl + z 停止ndk-gdb.
  • 在Eclipse中,选择运行→终止.
    4.创建C/C ++调试配置.我们需要创建一个调试配置,以踏入C/C ++源代码.
  • 在Eclipse 中,单击错误旁边的小箭头,然后选择”调试配置……”.
  • 双击左侧的树结构中的” C/C ++应用程序”.这将为新的C/C ++应用程序调试配置创建模板.
  • 在”名称:”字段中,将其命名为” debuggingtest c和cpp debug”,以确保您知道此配置专门适用于debuggingtest项目,并针对您的C/C ++源.
  • 在”主”选项卡中:
  • 单击” C/C ++应用程序:”字段上的”浏览…”.
    导航到”/home/test/testing/debuggingtest/obj/local/armeabi/app_process”,然后单击”确定”.
  • 单击”项目:”字段.
  • 上的”浏览…”

  • 选择” debuggingtest”,然后单击”确定”.
  • 检查”禁用自动构建”框.
  • 在表单的底部,您会看到”使用GDB(DSF)…… – 选择其他…”.按”选择其他…”按钮.
  • 在弹出窗口中,选中”使用配置特定设置”框.
  • 在列表中选择”标准创建过程启动器”,然后按” OK”.
  • 在”调试器”选项卡中:
  • 单击”调试器:”字段上的组合框,然后选择” gdbserver”.
  • 取消选中”停止启动的启动:” box.
  • 在”主”子标签中:
  • 单击” GDB调试器:”字段.
  • 上的”浏览…”

  • 导航到”/home/dev/ndk/toolchains/arm-linux-androideabi-4.4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb”,然后单击”确定”. 此调试器与Android NDK .
  • 分发

  • 在” gdb命令文件:”字段中,键入”/home/test/testing/debuggingtest/obj/local/armeabi/gdb2.setup”. GDB2.SETUP文件尚不存在,但我们会尽快创建它.
  • 选中”使用完整的文件路径设置断点”框.
  • 在”连接”子标签中:
  • 设置”类型:”到TCP
  • 设置”端口号:”到5039
  • 单击”应用”以保存您的更改.
  • 单击”关闭”
  • 在Eclipse工具栏中,单击错误旁边的小箭头,然后选择”组织收藏夹……”.
  • 单击”添加…”
  • 选择” debuggingtest c和cpp调试”,然后单击”确定”.

您的新调试配置现已创建并添加到您的收藏夹中.您可以通过单击工具栏中的错误旁边的小箭头来访问您的收藏夹. ” debuggingtest c和cpp调试”应位于列表的顶部.

  1. 创建gdb2.setup.前一步).因为gdb.setup文件是由NDK脚本重新创建的,因此您必须将其复制到gdb22.setup和point eclipse到gdb2.setup文件(我们在上一步中进行了).
  2. >

  • 在您的文件资源管理器中,导航到”/home/test/testing/debuggingtest/obj/local/armeabi/”.
  • 复制” gdb.setup”文件,然后将其粘贴到同一文件夹中.结果应该是一个名为” gdb(copy).setup”的文件.
  • 重命名” gdb(copy).setup”到” gdb2.setup”.
  • 通过双击文件打开gdb2.setup.
  • 替换为” SET solib-search-path ./obj/local/armeabi”,用” set solib-search-path/home/test/testing/testing/debuggingtest/obj/local/armeabi”.
  • 替换” file ./obj/local/armeabi/app_process”,用” file/home/test/testing/debuggingtest/obj/local/armeabi/app_process”.
  • 删除读取”目标遥控器:5039″的行.
  • 保存并关闭文件.
    5. 创建ndk-gdb-eclipse.最后一个日食家政项目. Eclipse将运行GDB二进制本身,因此我们必须从NDK-GDB中删除GDB的执行.我们将通过执行另一个复制式版本来保存原始内容.
  • 在您的文件资源管理器中,导航到”/home/dev/ndk”.
  • 复制” NDK-GDB”文件,然后将其粘贴到同一文件夹中.结果应该是一个名为” ndk-gdb(copy)”的文件.
  • 重命名” ndk-gdb(copy)”为” ndk-gdb-eclipse”.
  • 通过右键单击→使用其他应用程序打开ndk-gdb-eclipse …
  • 从应用程序列表中选择文本编辑器
  • 在文件中,找到读” $ gdbclient -x native_path $GDBSETUP”的行(可能在最底部),并通过将其列入”#”字符.
  • 来对其进行评论.

  • 保存并关闭文件.

当在Eclipse IDE内调试本机时,我们将使用 ndk-gdb-eclipse 而不是 ndk-gdb ..

调试/踏入代码

  1. 进入Java代码!
  • 在第20行(system.out.println(” hello world!”))中,请在debuggingTestactivity.java文件中放一个断点.
  • ).

  • 在进行本机代码中任何调用之前,在主活动中插入断点. onCreate()通常是最佳的地方.
  • 单击错误旁边的小箭头并选择” debuggingtest java调试”.
  • 您会在屏幕上看到一个标有”确认透视开关”的弹出窗口.如果您想切换到调试视角,请按”是”.我建议这样做.
  • 在这一点上,您应该已经达到了您设置的断点.

警告:我们刚刚击中onCreate函数内部的断点.在所有静态loadLibrary呼叫后,将调用此功能.请注意,在弹药函数之外,静态块内部有一个System.loadLibrary("DebuggingTestJNI").在我们输入onCreate函数之前,此载荷呼叫将执行,以确保我们的本机符号在我们击中初始断点时加载.必须在进行突破点之前停止!

  1. 进入C/C ++代码!
  • 在您的终端中,导航到debuggingtest目录并键入以下命令:
    ndk-gdb-eclipse←请记住,我们在步骤6中创建了此文件
  • 如果成功,该命令应在没有任何响应的情况下完成.
  • 通过单击错误旁边的小箭头,然后选择” debuggingtest c and cpp debug”
  • ,请返回日食并运行C/C ++调试器

  • 注意:当我这样做时,我会看到Eclipse控制台中的数十个错误,但是事情似乎仍然在起作用……
  • 切换回您的Java视角.
  • 单击Eclipse窗口右上方的双箭头,然后选择Java.
  • 打开debuggingtest/jni/com_sample_test_debuggingtestactivity.cpp
  • 在您的主要活动将调用的第一个JNI函数中设置断点.
  • 单击运行→简历( f8 )
  • 您将再次获取”透视开关”消息,因此请随时切换回调试视角.

您应该只点击我们刚刚在本机代码中设置的断点!

恭喜!!!

在这一点

以上所述是小编给大家介绍的Android NDK应用程序无法达到任何断点,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26050.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。