diff options
-rw-r--r-- | scripts/gdb/dalvik.gdb | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/scripts/gdb/dalvik.gdb b/scripts/gdb/dalvik.gdb index cab0951d7..6ee8d1d71 100644 --- a/scripts/gdb/dalvik.gdb +++ b/scripts/gdb/dalvik.gdb @@ -49,3 +49,62 @@ document dbt frame. If omitted r5 will be used as the default (as the case in the interpreter and JIT'ed code). end + +# ART debugging. ART uses SIGSEGV signals for internal purposes. To allow +# gdb to debug programs using ART we need to treat this signal specially. We +# also set a breakpoint in a libart.so function to stop when the program +# hits an unexpected breakpoint +set $art_debug_enabled = 0 +define art-on + if $art_debug_enabled == 0 + # deal with SIGSEGV signals + handle SIGSEGV noprint nostop pass + + # set a breakpoint and record its number + set breakpoint pending on + break art_sigsegv_fault + set $art_bpnum = $bpnum + commands $art_bpnum + silent + printf "Caught SIGSEGV in user program\n" + end + set breakpoint pending auto + + printf "ART debugging mode is enabled.\n" + set $art_debug_enabled = 1 + else + printf "ART debugging mode is already enabled.\n" + end +end + +document art-on + Enter ART debugging mode. In ART debugging mode, SIGSEGV signals are ignored + by gdb unless they are not handled by ART itself. A breakpoint is + set to stop the program when an unexpected SIGSEGV signal is + encountered. + + To switch ART debugging mode off, use "art-off" +end + +define art-off + if $art_debug_enabled == 1 + # restore SIGSEGV to its default + handle SIGSEGV print stop pass + + # delete our breakpoint + delete $art_bpnum + + set $art_debug_enabled = 0 + printf "ART debugging mode is disabled.\n" + end +end + +document art-off + Leave ART debugging mode. Signal handling is restored to default settings. + + Use the command "art-on" to enable ART debugging mode. +end + +# switch on ART debugging +art-on + |