2013-04-10 13 views
7

Podczas debugowania otrzymałem następujący komunikat o błędzie.Jakie są znaczenie elementów w komunikacie o błędzie "pułapkę wyrównania"?

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

Mam rozejrzał się trochę i znaleźć wiele informacji na ten real-time embedded website. Więc teraz wiem, co oznacza PC i Instr, ale nadal nie znalazłem nic o części Address i FSR.

Co to jest FSR? Do jakiego adresu odnosi się Address? Według proc/xxxx/maps ten adres jest nawet poza zakresem mojego programu. Czy ktokolwiek wie, co oznaczają ostatnie dwa elementy? Potrzebuję informacji na ich temat, aby rozwiązać ten problem z wyrównaniem.

wyjście MAP

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 

Odpowiedz

16
PC=0x00170ad8 

ta jest informacją, aktualną wartość licznika programu, może być wykorzystane do określenia który instrukcja w programie jest przyczyną pułapkę. Jeśli używasz ARM, tak jak myślę, to jest to aktualna instrukcja plus 8, więc instrukcja powodująca pułapkę znajduje się pod adresem 0x00170ad0.

Instr=0xe5960008 

To jest kodowanie błędnej instrukcji. Jeśli jest to na ramieniu, że instrukcja jest ldr r0, [r6, #8]

Address=0x00f28daa 

To mówi ci adres, z którego program próbował załadować, powodując awarię. Zakładając, że wszystko inne jak do tej pory jest poprawne, jest to r6 + 8, więc r6 posiadał 0x00f28da2 w momencie wystąpienia błędu.

FSR 0xf3 

Jest to wartość utrzymywane w stanie błędu zarejestrować. Mówi ci, co się stało. Ta konkretna wartość jest starszym kodowaniem (przed ARMv7) dla błędu wyrównania.

+2

Jeszcze jedno, skąd wiesz, że "Instr = 0xe5960008" to "ldr r0, [r6, # 8]". W objdump rzeczywiście tak mówi. –

+2

@NazeKimi: Właśnie dekodowałem, odwołując się do podręcznika referencyjnego ARM. –

1

Najprawdopodobniej Twój procesor nie obsługuje odczytuje/zapisuje z/do pamięci wartości pod adresami mylące. Jeśli uzyskujesz dostęp do 4-bajtowej zmiennej, to oczywiście adres = 0x00f28daa nie jest wielokrotnością 4. Tylko pojedyncze bajty mogą być czytane/zapisywane na arbitralnie wyrównanych adresach.

Ten artykuł wyjaśnia to dobrze.

+0

Dziękuję za odpowiedź. Ale myślę, że moje pytanie nie było jasne. Chciałem wiedzieć, do czego dokładnie odnoszą się te elementy. Czy adresy pamięci są odczytywane lub zapisywane? Potrzebuję informacji o tym, jaki adres jest, aby rozwiązać ten problem wyrównania. –

+0

0x00f28daa nie znajduje się na mapie. Założę się, że jest to wskaźnik uzyskany za pomocą wskaźnika arytmetycznego i/lub rzutowania wskaźnika i wskazuje on niektóre dane w sekcji danych (w tym rodata i bss) lub na stosie lub w stercie. Uruchom swój kod w debugerze. Dowiesz się szybko problematyczne miejsce. –

+0

Inną możliwością jest brak niezainicjalizowanego lub uszkodzonego wskaźnika. –

Powiązane problemy