繁体   English   中英

在Eclipse中调试Android NDK C / C ++代码 - 没有命中断点

[英]Debugging Android NDK C/C++ code in Eclipse - breakpoints are not hit

我下载了适用于Linux和Android NDK的Android SDK Bundle。 安装了ADT,我安装了CDT。

我创建了一个Android项目并添加了原生支持(jni)。 然后我在java代码中编写了本机函数,用c ++代码导出。 在c ++代码中我定义了这个函数。

Java的代码:

static {
    System.loadLibrary("test");
}

private native String get_text_from_cpp();

c ++代码(h):

extern "C"{
   JNIEXPORT jstring JNICALL Java_com_example_test_MainActivity_get_1text_1from_1cpp(JNIEnv *, jobject);
}

c ++代码(cpp):

JNIEXPORT jstring JNICALL Java_com_example_test_MainActivity_get_1text_1from_1cpp(JNIEnv * env, jobject){
    return env->NewStringUTF( "hello from C++" );
}

代码无误地运行。 但是当我在c ++代码中设置断点时,它没有被击中。

build-nkd NDK_DEBUG = 1 - 包括在内

我按照说明http://tools.android.com/recent/usingthendkplugin

jni中的Android.mk /具有LOCAL_CFLAGS:= -g

我已经阅读了很多信息,但我无法定制Eclipse。 请帮助任何人。

PS:对不起,我的英语不是我的母语。 我写作有困难。

添加:同样在控制台显示调试期间:“警告:无法加载95个库的共享库符号,例如/ system / bin / linker。使用”info sharedlibrary“命令查看完整列表。是否需要”set solib- search-path“或”set sysroot“?警告:无法找到动态链接器断点函数.GDB将最终重试。同时,很可能GDB无法调试共享库初始化程序或在dlopen()之后解析挂起的断点。”

我使用的技巧是将一个usleep调用作为我的调试代码中的第一个本机行。

这使您的线程处于睡眠状态,并为调试器提供为您准备的机会。

#include <unistd.h>

.
.
.

#ifndef NDEBUG
usleep(5000 * 1000);
#endif

挣扎了很多 Eclipse的调试后,这是我的食谱:

做通常的步骤:

  • 添加android.os.Debug.waitForDebugger(); 在加载本机库之前。 这可能有所帮助。
  • Application.mk添加APP_OPTIM := debug
  • 使用ndk-build NDK_DEBUG=1

然后,我发现了不同的东西:

  • 打开控制台并运行:

adb pull /system/bin/linker <your_project_base_dir>/obj/local/armeabi/linker

根据您的设备,您可能需要编写armeabiarmeabi-v7a 你只需要做一次(我注意到手动运行ndk-gdb正在这样做。手动执行该命令断点开始工作)

  • 最后,要调试使用菜单“运行 - >调试为 - > Android本机应用程序”

您可以使用ARM提供的DS-5 CE Android Debug工具作为eclipse的插件。 它工作得非常好,并为调试提供了一个非常好的和简单的UI。 根据我的个人经验,它比调试ndk应用程序的传统方式要好得多。

请参考以下链接,它将为您提供有关如何使用DS-5调试器的详细信息:

https://developer.arm.com/products/software-development-tools/ds-5-development-studio/resources/tutorials/android-native-app-debug-tutorial

您的应用程序很早就执行了JNI函数,因此调试器还没有准备好。 不幸的是,gdb建立远程连接需要一段时间,请参阅http://visualgdb.com/documentation/appstartup

而不是对抗风车,为您的活动添加一个按钮,并在该按钮的Click()上调用相同的本机方法 - 捕获断点将更容易。

BTW,关于95个库的警告是完全正常的。 这些是您不想调试的系统库,并且没有源代码。

考虑添加:

android.os.Debug.waitForDebugger();

在您的本机通话之前,这会让您的应用等到调试器附加,可以帮助您避免睡眠/使用按钮。

我有这个问题,唯一对我有用的就是投入

Thread.sleep(2000);

在加载JNI库之前。 在调用System.loadLibrary崩溃应用程序之前,这给了调试器足够的时间来附加。 帮我找到问题C ++代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM