Die (Wort)Adresse kann man auch erhalten mit
__builtin_return_address (0)
Eine sinnvolle Stelle, um mit dem Dumpen anzufangen, kann sein
__builtin_frame_address (0)
Damit enthält das Dump nur die Werte aus dem Frame, die gesicherten
Register und die Return-Adresse --zumindest für die aktuelle Funktion.
Wie groß der Frame ist und wie viele Register gesichert wurden, lässt
sich nicht so einfach feststellen.
Für die Anzahl der gesicherten Register:
1 | uint8_t volatile stack_usage;
|
2 |
|
3 | ISR (WDT_vect)
|
4 | {
|
5 | asm volatile ("ldi %0, .L__stack_usage" : "=d" (stack_usage));
|
6 | }
|
Dieser Wert enthält nicht PUSHes, die im Body der aktuellen Funktion
enthalten sind wie z.B. solche um ein printf.
Man kann diese Größen zwar auch direkt im s-File mit -save-temps
nachlesen, ist aber nervig wenn sich der Code öfter mal ändert.
Beispiel:
1 | /* prologue: Signal */
|
2 | /* frame size = 0 */
|
3 | /* stack size = 6 */
|
4 | .L__stack_usage = 6
|