panic!
The panic!
macro also sends its output to the ITM!
Change the main
function to look like this:
#[entry] fn main() -> ! { panic!("Hello, world!"); }
Let's try this program. But before that let's update openocd.gdb
to run that monitor
stuff for
us during GDB startup:
target remote :3333
set print asm-demangle on
set print pretty on
load
+monitor tpiu config internal itm.txt uart off 8000000
+monitor itm port 0 on
break main
continue
OK, now run it.
$ cargo run
(..)
Breakpoint 1, main () at src/06-hello-world/src/main.rs:10
10 panic!("Hello, world!");
(gdb) next
You'll see some new output in the itmdump
terminal.
$ # itmdump terminal
(..)
panicked at 'Hello, world!', src/06-hello-world/src/main.rs:10:5
Another thing you can do is catch the panic before it does the logging by
putting a breakpoint on the rust_begin_unwind
symbol.
(gdb) monitor reset halt
(..)
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x080026ba msp: 0x10002000
(gdb) break rust_begin_unwind
Breakpoint 2 at 0x80011d2: file $REGISTRY/panic-itm-0.4.0/src/lib.rs, line 46.
(gdb) continue
Continuing.
Breakpoint 2, rust_begin_unwind (info=0x10001fac) at $REGISTRY/panic-itm-0.4.0/src/lib.rs:46
46 interrupt::disable();
You'll notice that nothing got printed on the itmdump
console this time. If
you resume the program using continue
then a new line will be printed.
In a later section we'll look into other simpler communication protocols.