2013-04-10 4 views
7

Durante il mio debug, ho ricevuto il seguente messaggio di errore.Quali sono i significati degli elementi nel messaggio di errore "Trappola allineamento"?

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

Ho guardato un po 'intorno e ha trovato un sacco di informazioni su questo real-time embedded website. Così ora so cosa si riferisce a PC e Instr, ma non ho ancora trovato nulla sulla parte Address e FSR.

Che cos'è FSR? A quale indirizzo si riferisce Address? Secondo proc/xxxx/maps quell'indirizzo è anche al di fuori dello scopo del mio programma. Qualcuno sa cosa significano gli ultimi due elementi? Ho bisogno di informazioni su questi per risolvere questo problema di allineamento.

MAPPA uscita

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 

risposta

16
PC=0x00170ad8 

Questo vi dice il valore corrente del contatore programma di, può essere usato per determinare che istruzioni nel programma sta causando la trappola. Se sei su ARM come penso tu sia, questa è in realtà l'istruzione corrente più 8, quindi l'istruzione che causa la trappola si trova a 0x00170ad0.

Instr=0xe5960008 

Questa è la codifica dell'istruzione di errore. Se questo è su ARM, che l'istruzione è ldr r0, [r6, #8]

Address=0x00f28daa 

Questo vi sta dicendo l'indirizzo da cui il programma ha tentato di caricare, provocando il guasto. Supponendo che tutto il resto finora sia corretto, questo è r6 + 8, pertanto è trattenuto 0x00f28da2 al momento dell'errore.

FSR 0xf3 

Questo è il valore contenuto nel registro stato di errore . Ti dice quale errore si è verificato. Questo particolare valore è una codifica precedente (pre-ARMv7) per un errore di allineamento.

+2

Un'altra cosa, come facevi a sapere che "Instr = 0xe5960008" è "ldr r0, [r6, # 8]". L'objdump lo dice davvero. –

+2

@NazeKimi: l'ho solo decodificato facendo riferimento al manuale di riferimento ARM. –

1

Molto probabilmente la CPU non supporta legge/scrive da/alla memoria dei valori in indirizzi non allineati. Se stai accedendo a una variabile a 4 byte, allora Address = 0x00f28daa non è un multiplo di 4. Solo i singoli byte possono essere letti/scritti su indirizzi allineati in modo arbitrario.

Questo articolo lo spiega bene.

+0

Grazie per la risposta. Ma immagino che la mia domanda non sia chiara. In realtà volevo sapere a cosa si riferiscono esattamente quegli articoli. Gli indirizzi di memoria vengono letti o scritti? Ho bisogno di informazioni su quale indirizzo è per risolvere questo problema di allineamento. –

+0

0x00f28daa non è nella mappa. Scommetto che è un puntatore ottenuto con il puntatore aritmetico e/o puntatore e punta ad alcuni dati nella sezione dati (rodata e bss inclusi) o nello stack o nell'heap. Esegui il tuo codice nel debugger. Scoprirai rapidamente il posto problematico. –

+0

Un'altra possibilità è che si disponga di un puntatore non inizializzato o danneggiato. –