Search code examples
androideclipseandroid-ndkgdbbreakpoints

Continue after assert with Android NDK and GDB


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?


Solution

  • 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.