Die Idee ist simpel: Mit dem Debugger in einem fixen oder zufälligen Intervall das Programm pausieren und anschauen was gerade ausgeführt wurde, resp. den Backtrace ausgeben lassen. (Halb-)Automatisiert mit GDB Skripts kann aus den Logdaten ein simples Profiling des Programms erstellt werden. Folgend wird der fixe Intervall des SysTick-Interrupts verwendet um mit einem Breakpoint bei diesem den Backtrace auszugeben.
- Systick Interruptfrequenz anpassen, stellt Frequenz der "Abtastung" ein.
- folgende Zeilen als
profiling.gdb
speichern:
set logging on
break SysTick_Handler
commands 1
backtrace
end
- GDB Debugger starten in VSCode und in der Debug Konsole
-exev source profiling.gdb
eingeben - Debugging starten und ggf. immer wieder neustarten bis genügend Abtastungen aufgezeichnet wurden.
- GDB hat während der Ausführung eine Logdatei
gdb.txt
angelegt. Mit folgendem regulären Ausdruck können die interessanten Daten aus dieser Logdatei extrahiert werden. Als RegEx-Parser eignet sich z.B. regex101.
^~"#(\d+) (?:0x.+in |)(.+) \(.+$
- Die Daten mit Excel o.ä. analysieren z.B. die "Hits" per Funktion.
In Cortex-M basierten STM32 uC's ist eine Instrumentation Trace Macrocell (ITM) integriert. Mit dieser lässt sich unter anderem der Programmcode Live analysieren. Dazu wird mit OpenOCD eine debugging session gestartet, die ITM konfiguriert und die ITM Pakete an tcp Port 3443 bereitgestellt. Auf diesen Port kann sich dann Orbuculum verbinden und die Pakete analysieren.
- OpenOCD starten und konfigurieren:
openocd -f openocd_profiling.cfg
- Orbtop ausführen:
orbtop -e <elf_file>.elf -v 0
- ggf. mit der
-I <ms>
Option die Aktualisierungsrate verringern um über einen längeren Zeitraum zu analysieren - Die Verbindung mit OpenOCD ist aus unbekanntem Grund sehr instabil und bricht öfters nach einigen Sekunden mit folgendem Fehler ab:
Error: jtag status contains invalid mode value - communication failure
. OpenOCD einfach neustarten. Orbtop verbindet sich automatisch erneut.