Continue after assert with Android NDK and GDB

2

Is it possible to trigger an GDB break from C++ in an Android NDK program which still allows the program to resume afterwards?

Meaning, I hit the assert causing GDB to halt the program, and I want to be able to press the "Play" button in Eclipse to resume the program, continuing beyond the assert.

Right now I am using:

__asm__ ("bkpt 0");

This triggers the program to halt, and brings me to the line of code that triggered it, but does not allow me to resume afterwards.

GDB output the following at the time that the program is halted.

(gdb) 
82 info signal SIGBUS
&"info signal SIGBUS\n"
~"Signal        Stop\tPrint\tPass to program\tDescription\n"
~"SIGBUS        Yes\tYes\tYes\t\tBus error\n"
82^done
(gdb) 

If I press "resume" at this point I get the following output in the LogCat:

Fatal signal 11 (SIGSEGV) at 0xfffffffd (code=1)

Perhaps my quesiton is how to throw a non-fatal break?

android
eclipse
android-ndk
gdb
breakpoints
asked on Stack Overflow Oct 23, 2012 by Goose • edited Oct 24, 2012 by Goose

1 Answer

2

The standard Linux way of detecting if your process is being debugged is:

if (ptrace(PTRACE_TRACEME, 0, NULL, 0) == -1)
    //Yes, we're running under GDB

With that in mind, do a conditional hard breakpoint (bkpt 0) that only fires when under debugger.

Not sure if Java-only debugging in Android would affect ptrace. Give it a try.

EDIT: call raise(SIGABRT) to break. Then in GDB, type signal 0 to continue. Other signals, like SIGINT and SIGTRAP, might work too.

answered on Stack Overflow Oct 24, 2012 by Seva Alekseyev • edited Oct 24, 2012 by Seva Alekseyev

User contributions licensed under CC BY-SA 3.0