Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I downloaded Android SDK Bundle for Linux and Android NDK. ADT was installed, I installed CDT.

I created a Android project and added native support (jni). Then I wrote native function in java-code which exporting in c++ code. In c++ code I defined this function.

Java-code:

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

private native String get_text_from_cpp();

c++ code (h):

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

c++ code (cpp):

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

Code works without errors. But when I set breakpoint in c++ code it is not hit.

build-nkd NDK_DEBUG = 1 - are included

I followed this instructions http://tools.android.com/recent/usingthendkplugin

Android.mk in jni/ has LOCAL_CFLAGS := -g

I have read very much information but I could't customized Eclipse. Please, help anybody.

PS: I am sorry for my English is not my native language. I have difficulty in writing.

Add: Also during debug in console shows: "warning: Could not load shared library symbols for 95 libraries, e.g. /system/bin/linker. Use the "info sharedlibrary" command to see the complete listing. Do you need "set solib-search-path" or "set sysroot"? warning: Unable to find dynamic linker breakpoint function. GDB will retry eventurally. Meanwhile, it is likely that GDB is unable to debug shared library initializers or resolve pending breakpoints after dlopen()."

like image 307
newman Avatar asked Jul 17 '13 16:07

newman


2 Answers

The trick I use is to put a usleep call as the very first native line in my debug code.

This makes your thread sleep and gives the debugger a chance to be ready for you.

#include <unistd.h>

.
.
.

#ifndef NDEBUG
usleep(5000 * 1000);
#endif
like image 141
Bruce Avatar answered Sep 30 '22 15:09

Bruce


After struggling a lot to debug on Eclipse this is my recipe:

Do the usual steps:

  • Add android.os.Debug.waitForDebugger(); before loading your native library. This might help.
  • Add APP_OPTIM := debug in Application.mk
  • Build with ndk-build NDK_DEBUG=1

Then, what I found different:

  • Open a console and run:

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

Depending on your device you might have to write armeabi or armeabi-v7a. You only need to do it once (I noticed that running ndk-gdb manually was doing that. Executing that command manually the breakpoints started to work)

  • Finally, to debug use the menu "Run -> Debug As -> Android Native Application"
like image 27
Paglian Avatar answered Sep 30 '22 13:09

Paglian