Hello Rust Community,
long stroy short: I try to set a conditional breakpoint with a Result
-variable, which doesn't seem to be working.
Some context: my goal is to automatically run integration tests on an embedded micro-controller (currently STM32 Nucleo-L476, so --target thumbv7m-none-eabi
), but I don't think, that this is hugely important for the problem described below. The idea was to automatically run test-cases as binaries, that get loaded and run on the target hardware. By setting breakpoints on some key-functions, the tests are classified as passed/failed. And here lies the problem:
#![no_std]
#![no_main]
use cortex_m_semihosting::debug::{EXIT_FAILURE, EXIT_SUCCESS};
#[cortex_m_rt::entry]
fn main() -> ! {
// panic!("test-panic to see the GDB outcome");
cortex_m_semihosting::debug::exit(EXIT_SUCCESS);
panic!("semi-hosting is not enabled");
}
#[panic_handler]
fn test_failure(_: &core::panic::PanicInfo) -> ! {
cortex_m_semihosting::debug::exit(EXIT_FAILURE);
loop {}
}
The function to break on is cortex_m_semihosting::debug::exit(status)
. Depending on the value of status
I want to:
-
quit 1
ifstatus
isEXIT_FAILURE
(which has the value ofResult::<(), ()>::Err(())
). - else exit with 0, which is the default anyway, so no special
quit 0
is required here.
Normally this should be easy enough with something like this as a GDB-script (this is the whole file openocd.gdb
, but lines 9ff are relevant):
target extended-remote :3333
set print asm-demangle on
monitor arm semihosting enable
load
monitor reset init
# the next line is not working. This should break only if
break cortex_m_semihosting::debug::exit if status.is_err()
commands 1
quit 1
end
run
With a running Openocd-target, this could be invoked with
$ arm-none-eabi-gdb -x openocd.gdb target/thumbv7m-none-eabi/debug/deps/TEST_NAME
Unfortunately this does not work: GDB answers with the following output:
Error in testing breakpoint condition:
Structure has no component named is_err.
It seems like the function resolution or calling it does not work. But I don't see the reason described in the GDB docs. Maybe it's related to the generic type Result<T, E>
. Maybe I'm just blind
So, do you know the reason that this doesn't work? Or do you have an alternative suggestion?
Thanks in advance!