Ich verwende GDB, um ein Programm für einen Cortex M3 zu debuggen. In den Funktionen, bei denen das Programm abstürzt, wenn ich Zeile für Zeile ausführe (mit n
), erhalte ich schließlich:
(gdb) n
0x0800f498 in ?? ()
jetzt, wenn ich zurückverfolge (mit bt
) direkt nachdem ich bekomme:
(gdb) bt
#0 0x0800f498 in ?? ()
#1 0xfffffff8 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Worauf genau beziehen sich die Adressen 0x0800f498
und 0xfffffff8
? Wie bin ich dort angekommen? Würde ein Blick auf die Linker- map
Datei helfen?
Bearbeiten : Wenn ich info registers
das mache, bekomme ich:
info registers
r0 0x2001ffe8 537001960
r1 0x0 0
r2 0x0 0
r3 0x7ada53e6 2061128678
r4 0x0 0
r5 0x0 0
r6 0x0 0
r7 0x0 0
r8 0x0 0
r9 0x0 0
r10 0x0 0
r11 0x0 0
r12 0x0 0
sp 0x2001ffb0 0x2001ffb0
lr 0xfffffff9 4294967289
pc 0x800f499 0x800f499
fps 0x0 0
cpsr 0x1000023 16777251
Sie haben zwei Probleme:
In diesem Fall wird der Debugger durch den magischen 0xFFFFFFFx-Wert in LR verwirrt. Sie könnten versuchen, die auf dem Stack gespeicherten Registerwerte manuell zu überprüfen, um den ursprünglichen PC-Wert zu finden.
Die Adresse 0x0800f498
befindet sich möglicherweise im Hard Fault
Ausnahmehandler. Normalerweise verwende ich meinen eigenen Handler mit einer speziellen LED-Blinksequenz, damit ich weiß, wenn etwas schief gelaufen ist.
Die gdb in Sourcery CodeBench unterstützt dieses Ausnahmemodell, aber Sie benötigen möglicherweise eine target.xml
Datei, um es zu aktivieren.
Die Hexadezimalzahl ist der Wert des Programmzählers oder der Stapeladresse (sehen Sie in Ihren Handbüchern nach), das "??" ist die Funktion, die gerade ausgeführt wird.
Wenn Sie Ihren Code mit Debugging-Symbolen kompilieren (mit gcc müssen Sie das -g
Flag verwenden), sollte der Debugger in der Lage sein, den Funktionsnamen korrekt auszugeben.
Um es selbst herauszufinden, können Sie entweder die Map-Datei studieren oder verwenden, address2line
die sich in Ihrer GNU ARM-Toolchain befinden sollte.
-g
Flag. Normalerweise gibt es den Namen der Funktion ganz schön aus, aber hier - wo mein Programm abstürzt - wird es verwirrt.
Stefan Paul Noack
0xfffffff8
komisch aus, vielleicht die Vermutung "korrupter Stack?" ist richtig.TurboJ
LR = 0xFFFFFFF9
ist ein "magischer" Wert für die Ausnahmerückgabe.Toby Jaffey