Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get ndk-gdb working on Android?

I'm trying to get the NDK debugger working but with no success so far.

To make sure my debug symbols are present and valid, I use the compiler options -O0 and -g, and the ndk-build parameter NDK_DEBUG=1.

The ndk-gdb script runs with out issues and launches GDB. When do a "sharedlibrary" command, I get this:

Symbols already loaded for /bla/bla/libMySharedLib.so 

However when I try breaking execution or e.g. adding a segfault to test, I never get any of the symbols from that library in the call stack. The only symbols I've gotten are from libc, if I break execution while it's waiting for a mutex for instance. Also tried adding breakpoints with no luck. GDB lets me add the breakpoints, and the code runs fine, but the breakpoints are never triggered.

I'm using API level 8 as I need to support Android 2.2 (Froyo).

like image 973
Simplex Avatar asked May 10 '12 12:05

Simplex


People also ask

How do I run a GDB file?

Use the run command to start your program under GDB. You must first specify the program name (except on VxWorks) with an argument to GDB (see section Getting In and Out of GDB), or by using the file or exec-file command (see section Commands to specify files).

What compiler does Android NDK use?

The NDK itself invokes a customized cross-compiler built on the arm-eabi-gcc compiler.


1 Answers

You don't need to use -O0 or -g switches. You need to do one of following:

  1. put android:debuggable="true" to the <application> tag in AndroidManifest.xml file
  2. use NDK_DEBUG=1 after ndk-build
  3. put APP_OPTIM := debug in Application.mk file

Doing anyone of these three things will automatically use -O0 and -g switches.

Can you try running gdb manually, without gdb script? It involves following steps:

  1. pushing gdbserver file to /data/local folder on device
  2. running your application & invoking in adb shell following command gdbserver :5055 --attach PID, where PID is your application process id.
  3. running adb forward tcp:5055 tcp:5055 on host
  4. running arm-linux-androideabi-gdb.exe from your app folder
  5. entering following commands in gdb
  6. set solib-search-path obj/local/armeabi
  7. file obj/local/armeabi/libMySharedLib.so
  8. target remote :5055

And see if you can debug then.

If you want see symbols for other shared libraries your library is using like libc.so, then pull them from device (from /system/lib folder) to your obj/local/armeabi folder.

like image 182
Mārtiņš Možeiko Avatar answered Sep 23 '22 16:09

Mārtiņš Možeiko