2013-04-10 5 views
7

Während meines Debugging habe ich die folgende Fehlermeldung erhalten.Was bedeuten die Elemente in der Fehlermeldung "Alignment Trap"?

Alignment trap: my_main (29858) PC=0x00170ad8 Instr=0xe5960008 Address=0x00f28daa FSR 0x0f3

Ich habe ein bisschen herum geschaut und eine Menge Informationen zu diesem real-time embedded website gefunden. So jetzt weiß ich, was 10 und Instr bezieht sich auf, aber ich habe immer noch nichts über die Address und FSR Teil gefunden.

Was ist FSR? Auf welche Adresse bezieht sich Address? Laut proc/xxxx/maps ist diese Adresse sogar außerhalb des Rahmens meines Programms. Weiß jemand, was die letzten beiden Punkte bedeuten? Ich brauche Informationen darüber, um dieses Ausrichtungsproblem zu lösen.

MAP Ausgang

00008000-001fe000 r-xp 00000000 03:02 16204  /home/myuser/my_main 
00205000-00248000 rw-p 001f5000 03:02 16204  /home/myuser/my_main 
00248000-00299000 rwxp 00248000 00:00 0 
40000000-40018000 r-xp 00000000 03:01 2095  /lib/ld-2.3.3.so 
40018000-4001b000 rw-p 40018000 00:00 0 
4001f000-40020000 r--p 00017000 03:01 2095  /lib/ld-2.3.3.so 
40020000-40021000 rw-p 00018000 03:01 2095  /lib/ld-2.3.3.so 
40021000-40023000 r-xp 00000000 03:01 15724  /usr/lib/libem7.so.1.0.1 
40023000-40029000 ---p 00002000 03:01 15724  /usr/lib/libem7.so.1.0.1 
40029000-4002b000 rw-p 00000000 03:01 15724  /usr/lib/libem7.so.1.0.1 
4002b000-40031000 r-xp 00000000 03:01 2057  /lib/tls/librt-2.3.3.so 
40031000-40033000 ---p 00006000 03:01 2057  /lib/tls/librt-2.3.3.so 
40033000-40038000 rw-p 00000000 03:01 2057  /lib/tls/librt-2.3.3.so 
40038000-40039000 r--p 00005000 03:01 2057  /lib/tls/librt-2.3.3.so 
40039000-4003a000 rw-p 00006000 03:01 2057  /lib/tls/librt-2.3.3.so 
4003a000-4004a000 r-xp 00000000 03:01 2060  /lib/tls/libpthread-2.3.3.so 
4004a000-40051000 rw-p 00008000 03:01 2060  /lib/tls/libpthread-2.3.3.so 
40051000-40052000 r--p 0000f000 03:01 2060  /lib/tls/libpthread-2.3.3.so 
40052000-40053000 rw-p 00010000 03:01 2060  /lib/tls/libpthread-2.3.3.so 
40053000-40055000 rw-p 40053000 00:00 0 
40055000-4010e000 r-xp 00000000 03:01 15703  /usr/lib/libstdc++.so.6.0.3 
4010e000-40115000 ---p 000b9000 03:01 15703  /usr/lib/libstdc++.so.6.0.3 
40115000-40119000 rw-p 000b8000 03:01 15703  /usr/lib/libstdc++.so.6.0.3 
40119000-4011f000 rw-p 40119000 00:00 0 
4011f000-401b7000 r-xp 00000000 03:01 2076  /lib/tls/libm-2.3.3.so 
401b7000-401be000 rw-p 00090000 03:01 2076  /lib/tls/libm-2.3.3.so 
401be000-401bf000 r--p 00097000 03:01 2076  /lib/tls/libm-2.3.3.so 
401bf000-401c0000 rw-p 00098000 03:01 2076  /lib/tls/libm-2.3.3.so 
401c0000-401c8000 r-xp 00000000 03:01 2005  /lib/libgcc_s.so.1 
401c8000-401c9000 rw-p 00008000 03:01 2005  /lib/libgcc_s.so.1 
401c9000-402cb000 r-xp 00000000 03:01 2078  /lib/tls/libc-2.3.3.so 
402cb000-402d1000 ---p 00102000 03:01 2078  /lib/tls/libc-2.3.3.so 
402d1000-402d2000 rw-p 00100000 03:01 2078  /lib/tls/libc-2.3.3.so 
402d2000-402d4000 r--p 00101000 03:01 2078  /lib/tls/libc-2.3.3.so 
402d4000-402d6000 rw-p 00103000 03:01 2078  /lib/tls/libc-2.3.3.so 
402d6000-402d8000 rw-p 402d6000 00:00 0 
402d8000-402e5000 rw-s 00000000 00:07 0   /SYSV12345678 (deleted) 
402e5000-402e6000 ---p 402e5000 00:00 0 
402e6000-402f5000 rwxp 402e6000 00:00 0 
403c1000-4049d000 rw-p 403c1000 00:00 0 
7efeb000-7f000000 rwxp 7efeb000 00:00 0 

Antwort

16
PC=0x00170ad8 

Dies ist der aktuelle Wert des Zähler Programm zu sagen, kann es die in Ihrem Programm zu bestimmen, verwendet werden, um die Falle zu verursachen. Wenn Sie auf ARM sind, wie ich denke, Sie sind, ist dies tatsächlich die aktuelle Anweisung plus 8, so dass die Anweisung, die die Falle verursacht, befindet sich unter 0x00170ad0.

Instr=0xe5960008 

Dies ist die Codierung der fehlerhaften Anweisung. Wenn dies auf ARM ist, ist, dass der Befehl ldr r0, [r6, #8]

Address=0x00f28daa 

Dies sagt Ihnen, die Adresse, von der das Programm zu laden versucht, den Fehler verursacht. Vorausgesetzt, alles andere ist soweit richtig, ist dies r6 + 8, also r6 gehalten 0x00f28da2 zum Zeitpunkt des Fehlers.

FSR 0xf3 

Dies ist der Wert in dem Status registriert Fehler gehalten. Es zeigt Ihnen, welcher Fehler aufgetreten ist. Dieser spezielle Wert ist eine ältere Kodierung (vor ARMv7) für einen Ausrichtungsfehler.

+2

Noch eine Sache, woher wissen Sie, dass "Instr = 0xe5960008" "ldr r0, [r6, # 8]" ist. Der Objdump sagt es tatsächlich. –

+2

@NazeKimi: Ich habe es gerade entschlüsselt, indem ich mich auf das ARM-Referenzhandbuch bezog. –

1

Wahrscheinlich Ihre CPU nicht unterstützt lesen/aus/in den Speichern von Werten bei falsch ausgerichteten Adressen schreiben. Wenn Sie auf eine 4-Byte-Variable zugreifen, ist Address = 0x00f28daa eindeutig kein Vielfaches von 4. Nur einzelne Bytes können an beliebig ausgerichteten Adressen gelesen/geschrieben werden.

Dieser Artikel erklärt es gut.

+0

Vielen Dank für Ihre Antwort. Aber ich denke, meine Frage war nicht klar. Ich wollte eigentlich wissen, worauf genau sich diese Dinge beziehen. Werden Speicheradressen gelesen oder geschrieben? Ich brauche Informationen darüber, was diese Adresse ist, um dieses Ausrichtungsproblem zu lösen. –

+0

0x00f28daa ist nicht in der Karte. Ich wette, es ist ein Zeiger, der mit Zeigerarithmetik und/oder Zeigercasting erhalten wird und er zeigt auf einige Daten entweder im Datenabschnitt (Rodata und Bss enthalten) oder auf dem Stapel oder im Heap. Führen Sie Ihren Code im Debugger aus. Sie werden schnell den problematischen Ort herausfinden. –

+0

Eine andere Möglichkeit ist, dass Sie einen nicht initialisierten oder beschädigten Zeiger haben. –

Verwandte Themen