2013-04-10 20 views
7

Hata ayıklama sırasında, aşağıdaki hata iletisini aldım."Hizalama tuzağı" hata iletisindeki öğelerin anlamı nedir?

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

Ben biraz etrafına baktı ve bu real-time embedded website üzerinde birçok bilgi buldum. Yani şimdi ne PC ve Instr başvuruyor, ancak hala Address ve FSR bölüm hakkında hiçbir şey bulamadım.

FSR nedir? Address adresi ne içindir? proc/xxxx/maps'a göre bu adresim programımın dışında kalıyor. Son iki maddenin ne anlama geldiğini bilen var mı? Bu hizalama problemini çözmek için bunlara dair bilgiye ihtiyacım var. desteklemediği

MAP çıkışı

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 

cevap

16
PC=0x00170ad8 

, programda talimat tuzağını neden olduğunu belirlemek için kullanılabilir. Eğer olduğunuzu düşündüğüm gibi ARM'de iseniz, bu aslında geçerli komut artı 8'dir, bu yüzden tuzağa neden olan talimat 0x00170ad0'da bulunur.

Instr=0xe5960008 

Bu, hata giderme yönergesinin kodlamasıdır. Bu ARM açıksa bu hatayı neden size programı yüklemek için teşebbüs hangi adresini anlatıyor ldr r0, [r6, #8]

Address=0x00f28daa 

, o talimatıdır. Şimdiye kadar olan her şeyin doğru olduğunu varsayarsak, bu r6 + 8, yani r6 hata anında 0x00f28da2 tutulur.

FSR 0xf3 

Bu

arıza durumunda tutulan değer kayıt olduğunu. Hangi hatanın meydana geldiğini söyler. Bu özel değer, bir Hizalama hatası için daha eski bir kodlamadır (ARMv7 öncesi).

+2

Bir şey daha, nasıl öğrendin "Instr = 0xe5960008" "ldr r0, [r6, # 8]". Objdump gerçekten öyle diyor. –

+2

@NazeKimi: Sadece ARM referans kılavuzuna bakarak kodu çözdüm. –

1

Büyük olasılıkla CPU// dan yanlış hizalanmış adreslerde değerlerin hafızaya yazar okur. 4 baytlık bir değişkene erişiyorsanız, o zaman açıkça Adres = 0x00f28daa, 4'ün katları değildir. Rasgele hizalanmış adreslerde yalnızca tek baytlar okunabilir/yazılabilir.

Bu makale iyi açıklıyor. Bu size program sayacının geçerli değerini anlatıyor

+0

Cevabınız için teşekkür ederiz. Ama sanırım sorum açık değildi. Aslında bu maddelerin tam olarak neye başvurduğunu bilmek istedim. Hafıza adresleri okunuyor veya yazılıyor mu? Bu hizalama problemini çözmek için bu adresin ne olduğu hakkında bilgiye ihtiyacım var. –

+0

0x00f28daa haritada değil. Bahse girerim, işaretçi aritmetiği ve/veya işaretçi dökümü ile elde edilen bir işaretçidir ve veri bölümünde (rodata ve bss dahil) veya yığında veya yığında bazı verilere işaret eder. Kodunuzu hata ayıklayıcısında çalıştırın. Hızlı bir şekilde problemli yeri öğreneceksiniz. –

+0

Başka bir olasılık, başlatılmamış veya bozuk bir işaretçiniz olmasıdır. –