blob: 6281661efebf4540c2df46dd309d05212c21ab88 [file] [log] [blame]
Ben Cheng07086002013-06-24 14:30:48 -07001# dump dalvik backtrace
2define dbt
3 if $argc == 1
4 set $FP = $arg0
5 else
6 set $FP = $r5
7 end
8
9 set $frame = 0
10 set $savedPC = 0
11 while $FP
12 set $stackSave = $FP - sizeof(StackSaveArea)
13 set $savedPC = ((StackSaveArea *)$stackSave)->savedPc
14 set $method = ((StackSaveArea *)$stackSave)->method
15 printf "#%d\n", $frame
16 printf " FP = %#x\n", $FP
17 printf " stack save = %#x\n", $stackSave
18 printf " Curr pc = %#x\n", ((StackSaveArea *) $stackSave)->xtra.currentPc
19 printf " FP prev = %#x\n", ((StackSaveArea *) $stackSave)->prevFrame
20 if $method != 0
21 printf " returnAddr: 0x%x\n", \
22 ((StackSaveArea *)$stackSave)->returnAddr
23 printf " class = %s\n", ((Method *) $method)->clazz->descriptor
24 printf " method = %s (%#08x)\n", ((Method *) $method)->name, $method
25 printf " signature = %s\n", ((Method *) $method)->shorty
26 printf " bytecode offset = 0x%x\n", (short *) (((StackSaveArea *) $stackSave)->xtra.currentPc) - (short *) (((Method *) $method)->insns)
27 set $regSize = ((Method *) $method)->registersSize
28 set $insSize = ((Method *) $method)->insSize
29 set $index = 0
30 while $index < $regSize
31 printf " v%d = %d", $index, ((int *)$FP)[$index]
32 if $regSize - $index <= $insSize
33 printf " (in%d)\n", $insSize - $regSize + $index
34 else
35 printf " (local%d)\n", $index
36 end
37 set $index = $index + 1
38 end
39 else
40 printf " break frame\n"
41 end
42 set $FP = (int) ((StackSaveArea *)$stackSave)->prevFrame
43 set $frame = $frame + 1
44 end
45end
46
47document dbt
48 Unwind Dalvik stack frames. Argument 0 is the frame address of the top
49 frame. If omitted r5 will be used as the default (as the case in the
50 interpreter and JIT'ed code).
51end
Dave Allison22382a42014-09-08 16:33:24 -070052
53# ART debugging. ART uses SIGSEGV signals for internal purposes. To allow
54# gdb to debug programs using ART we need to treat this signal specially. We
55# also set a breakpoint in a libart.so function to stop when the program
56# hits an unexpected breakpoint
57set $art_debug_enabled = 0
58define art-on
59 if $art_debug_enabled == 0
60 # deal with SIGSEGV signals
61 handle SIGSEGV noprint nostop pass
62
63 # set a breakpoint and record its number
64 set breakpoint pending on
65 break art_sigsegv_fault
66 set $art_bpnum = $bpnum
67 commands $art_bpnum
68 silent
69 printf "Caught SIGSEGV in user program\n"
70 end
71 set breakpoint pending auto
72
73 printf "ART debugging mode is enabled.\n"
Christopher Ferris436b7402014-10-03 17:31:41 -070074 printf "If you are debugging a native only process, you need to\n"
75 printf "re-enable normal SIGSEGV handling using this command:\n"
76 printf " handle SIGSEGV print stop\n"
Dave Allison22382a42014-09-08 16:33:24 -070077 set $art_debug_enabled = 1
78 else
79 printf "ART debugging mode is already enabled.\n"
80 end
81end
82
83document art-on
84 Enter ART debugging mode. In ART debugging mode, SIGSEGV signals are ignored
85 by gdb unless they are not handled by ART itself. A breakpoint is
86 set to stop the program when an unexpected SIGSEGV signal is
87 encountered.
88
89 To switch ART debugging mode off, use "art-off"
90end
91
92define art-off
93 if $art_debug_enabled == 1
94 # restore SIGSEGV to its default
95 handle SIGSEGV print stop pass
96
97 # delete our breakpoint
98 delete $art_bpnum
99
100 set $art_debug_enabled = 0
101 printf "ART debugging mode is disabled.\n"
102 end
103end
104
105document art-off
106 Leave ART debugging mode. Signal handling is restored to default settings.
107
108 Use the command "art-on" to enable ART debugging mode.
109end