| OLD | NEW |
| (Empty) |
| 1 # ARM debugging with the simulator | |
| 2 | |
| 3 The simulator and debugger can be very helpful when working with v8 code generat
ion. | |
| 4 | |
| 5 * It is convenient as it allows you to test code generation without access to
actual hardware. | |
| 6 * No cross or native compilation is needed. | |
| 7 * The simulator fully supports the debugging of generated code. | |
| 8 | |
| 9 Please note that this simulator is designed for v8 purposes. Only the features u
sed by v8 are implemented, and you might encounter unimplemented features or ins
tructions. In this case, feel free to implement them and submit the code! | |
| 10 | |
| 11 | |
| 12 ## Details on the ARM Debugger | |
| 13 | |
| 14 Compile the ARM simulator shell with: | |
| 15 ``` | |
| 16 make arm.debug | |
| 17 ``` | |
| 18 on an x86 host using your regular compiler. | |
| 19 | |
| 20 ### Starting the Debugger | |
| 21 There are different ways of starting the debugger: | |
| 22 | |
| 23 ``` | |
| 24 $ out/arm.debug/d8 --stop_sim_at <n> | |
| 25 ``` | |
| 26 The simulator will start the debugger after executing n instructions. | |
| 27 | |
| 28 ``` | |
| 29 $ out/arm.debug/d8 --stop_at <function name> | |
| 30 ``` | |
| 31 | |
| 32 The simulator will stop at the given JavaScript function. | |
| 33 | |
| 34 Also you can directly generate 'stop' instructions in the ARM code. Stops are ge
nerated with | |
| 35 | |
| 36 ``` | |
| 37 Assembler::stop(const char* msg, Condition cond, int32_t code) | |
| 38 ``` | |
| 39 | |
| 40 When the Simulator hits a stop, it will print msg and start the debugger. | |
| 41 | |
| 42 | |
| 43 ### Debugging commands. | |
| 44 | |
| 45 **Usual commands:** | |
| 46 | |
| 47 Enter `help` in the debugger prompt to get details on available commands. These
include usual gdb-like commands, such as stepi, cont, disasm, etc. If the Simula
tor is run under gdb, the “gdb” debugger command will give control to gdb. You c
an then use cont from gdb to go back to the debugger. | |
| 48 | |
| 49 | |
| 50 **Debugger specific commands:** | |
| 51 | |
| 52 Here's a list of the ARM debugger specific commands, along with examples. | |
| 53 The JavaScript file “func.js” used below contains: | |
| 54 | |
| 55 ``` | |
| 56 function test() { | |
| 57 print(“In function test.”); | |
| 58 } | |
| 59 test(); | |
| 60 ``` | |
| 61 | |
| 62 * **printobject** `<`register`>` (alias po), will describe an object held in
a register. | |
| 63 | |
| 64 ``` | |
| 65 $ out/arm.debug/d8 func.js --stop_at test | |
| 66 | |
| 67 Simulator hit stop-at | |
| 68 0xb544d6a8 e92d4902 stmdb sp!, {r1, r8, fp, lr} | |
| 69 sim> print r0 | |
| 70 r0: 0xb547ec15 -1253577707 | |
| 71 sim> printobject r0 | |
| 72 r0: | |
| 73 0xb547ec15: [Function] | |
| 74 - map = 0x0xb540ff01 | |
| 75 - initial_map = | |
| 76 - shared_info = 0xb547eb2d <SharedFunctionInfo> | |
| 77 - name = #test | |
| 78 - context = 0xb60083f1 <FixedArray[52]> | |
| 79 - code = 0xb544d681 <Code> | |
| 80 #arguments: 0xb545a15d <Proxy> (callback) | |
| 81 #length: 0xb545a14d <Proxy> (callback) | |
| 82 #name: 0xb545a155 <Proxy> (callback) | |
| 83 #prototype: 0xb545a145 <Proxy> (callback) | |
| 84 #caller: 0xb545a165 <Proxy> (callback) | |
| 85 ``` | |
| 86 | |
| 87 * **break** `<`address`>`, will insert a breakpoint at the specified address. | |
| 88 | |
| 89 * **del**, will delete the current breakpoint. | |
| 90 | |
| 91 You can have only one such breakpoint. This is useful if you want to insert a br
eakpoint at runtime. | |
| 92 ``` | |
| 93 $ out/arm.debug/d8 func.js --stop_at test | |
| 94 | |
| 95 Simulator hit stop-at | |
| 96 0xb53a1ee8 e92d4902 stmdb sp!, {r1, r8, fp, lr} | |
| 97 sim> disasm 5 | |
| 98 0xb53a1ee8 e92d4902 stmdb sp!, {r1, r8, fp, lr} | |
| 99 0xb53a1eec e28db008 add fp, sp, #8 | |
| 100 0xb53a1ef0 e59a200c ldr r2, [r10, #+12] | |
| 101 0xb53a1ef4 e28fe004 add lr, pc, #4 | |
| 102 0xb53a1ef8 e15d0002 cmp sp, r2 | |
| 103 sim> break 0xb53a1ef8 | |
| 104 sim> cont | |
| 105 0xb53a1ef8 e15d0002 cmp sp, r2 | |
| 106 sim> disasm 5 | |
| 107 0xb53a1ef8 e15d0002 cmp sp, r2 | |
| 108 0xb53a1efc 359ff034 ldrcc pc, [pc, #+52] | |
| 109 0xb53a1f00 e5980017 ldr r0, [r8, #+23] | |
| 110 0xb53a1f04 e59f1030 ldr r1, [pc, #+48] | |
| 111 0xb53a1f08 e52d0004 str r0, [sp, #-4]! | |
| 112 sim> break 0xb53a1f08 | |
| 113 setting breakpoint failed | |
| 114 sim> del | |
| 115 sim> break 0xb53a1f08 | |
| 116 sim> cont | |
| 117 0xb53a1f08 e52d0004 str r0, [sp, #-4]! | |
| 118 sim> del | |
| 119 sim> cont | |
| 120 In function test. | |
| 121 ``` | |
| 122 | |
| 123 * Generated `stop` instuctions, will work as breakpoints with a few additional
features. | |
| 124 | |
| 125 The first argument is a help message, the second is the condition, and the third
is the stop code. If a code is specified, and is less than 256, the stop is sai
d to be “watched”, and can be disabled/enabled; a counter also keeps track of ho
w many times the Simulator hits this code. | |
| 126 | |
| 127 If we are working on this v8 C++ code, which is reached when running our JavaScr
ipt file. | |
| 128 | |
| 129 ``` | |
| 130 __ stop("My stop.", al, 123); | |
| 131 __ mov(r0, r0); | |
| 132 __ mov(r0, r0); | |
| 133 __ mov(r0, r0); | |
| 134 __ mov(r0, r0); | |
| 135 __ mov(r0, r0); | |
| 136 __ stop("My second stop.", al, 0x1); | |
| 137 __ mov(r1, r1); | |
| 138 __ mov(r1, r1); | |
| 139 __ mov(r1, r1); | |
| 140 __ mov(r1, r1); | |
| 141 __ mov(r1, r1); | |
| 142 ``` | |
| 143 | |
| 144 Here's a sample debugging session: | |
| 145 | |
| 146 We hit the first stop. | |
| 147 | |
| 148 ``` | |
| 149 Simulator hit My stop. | |
| 150 0xb53559e8 e1a00000 mov r0, r0 | |
| 151 ``` | |
| 152 | |
| 153 We can see the following stop using disasm. The address of the message string is
inlined in the code after the svc stop instruction. | |
| 154 | |
| 155 ``` | |
| 156 sim> disasm | |
| 157 0xb53559e8 e1a00000 mov r0, r0 | |
| 158 0xb53559ec e1a00000 mov r0, r0 | |
| 159 0xb53559f0 e1a00000 mov r0, r0 | |
| 160 0xb53559f4 e1a00000 mov r0, r0 | |
| 161 0xb53559f8 e1a00000 mov r0, r0 | |
| 162 0xb53559fc ef800001 stop 1 - 0x1 | |
| 163 0xb5355a00 08338a97 stop message: My second stop | |
| 164 0xb5355a04 e1a00000 mov r1, r1 | |
| 165 0xb5355a08 e1a00000 mov r1, r1 | |
| 166 0xb5355a0c e1a00000 mov r1, r1 | |
| 167 ``` | |
| 168 | |
| 169 Information can be printed for all (watched) stops which were hit at least once. | |
| 170 | |
| 171 ``` | |
| 172 sim> stop info all | |
| 173 Stop information: | |
| 174 stop 123 - 0x7b: Enabled, counter = 1, My stop. | |
| 175 sim> cont | |
| 176 Simulator hit My second stop | |
| 177 0xb5355a04 e1a00000 mov r1, r1 | |
| 178 sim> stop info all | |
| 179 Stop information: | |
| 180 stop 1 - 0x1: Enabled, counter = 1, My second stop | |
| 181 stop 123 - 0x7b: Enabled, counter = 1, My stop. | |
| 182 ``` | |
| 183 | |
| 184 Stops can be disabled or enabled. (Only available for watched stops.) | |
| 185 | |
| 186 ``` | |
| 187 sim> stop disable 1 | |
| 188 sim> cont | |
| 189 Simulator hit My stop. | |
| 190 0xb5356808 e1a00000 mov r0, r0 | |
| 191 sim> cont | |
| 192 Simulator hit My stop. | |
| 193 0xb5356c28 e1a00000 mov r0, r0 | |
| 194 sim> stop info all | |
| 195 Stop information: | |
| 196 stop 1 - 0x1: Disabled, counter = 2, My second stop | |
| 197 stop 123 - 0x7b: Enabled, counter = 3, My stop. | |
| 198 sim> stop enable 1 | |
| 199 sim> cont | |
| 200 Simulator hit My second stop | |
| 201 0xb5356c44 e1a00000 mov r1, r1 | |
| 202 sim> stop disable all | |
| 203 sim> con | |
| 204 In function test. | |
| 205 ``` | |
| OLD | NEW |