2013-04-10 3 views
7

Во время моей отладки у меня появилось следующее сообщение об ошибке.В чем смысл элементов сообщения об ошибке «выравнивание ловушки»?

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

Я посмотрел вокруг немного и нашел много информации об этом real-time embedded website. Итак, теперь я знаю, что такое PC и Instr, но я до сих пор ничего не нашел о Address и FSR.

Что такое FSR? Какой адрес Address обратитесь к? Согласно proc/xxxx/maps этот адрес выходит за рамки моей программы. Кто-нибудь знает, что означают последние два пункта? Мне нужна информация об этом, чтобы решить эту проблему выравнивания.

выхода 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 

ответ

16
PC=0x00170ad8 

Это говорит вам текущее значение счетчика программы, он может быть использован для определения которых обучения в вашей программе вызывает ловушку. Если вы находитесь на ARM, как мне кажется, это настоящая инструкция плюс 8, поэтому инструкция, вызывающая ловушку, находится на 0x00170ad0.

Instr=0xe5960008 

Это кодировка инструкции по сбою. Если это на ARM, что инструкция ldr r0, [r6, #8]

Address=0x00f28daa 

Это говорит вам адрес, с которого программа пытался загрузить, вызывая ошибку. Предполагая, что все остальное до сих пор верно, это r6 + 8, поэтому r6 провел 0x00f28da2 во время вины.

FSR 0xf3 

Это значение проведено в состоянии в регистре неисправностей. Он сообщает вам, что произошло. Это значение представляет собой более раннее кодирование (pre-ARMv7) для ошибки выравнивания.

+2

Еще одна вещь, откуда вы знаете, что «Instr = 0xe5960008» - это «ldr r0, [r6, # 8]». Обьямп действительно так говорит. –

+2

@NazeKimi: Я просто расшифровал его, обратившись к справочному руководству по ARM. –

1

Скорее всего, ваш процессор не поддерживает чтение/запись из/в память значений в неровных адресах. Если вы обращаетесь к 4-байтовой переменной, то ясно, что Address = 0x00f28daa не является кратным 4. Только одиночные байты могут быть прочитаны/записаны на произвольно выровненных адресах.

Эта статья объясняет это хорошо.

+0

Благодарим вас за ответ. Но я думаю, что мой вопрос не был ясен. Я действительно хотел знать, о чем именно относятся эти пункты. Эти адреса памяти читаются или записываются? Мне нужна информация о том, что этот адрес предназначен для решения этой проблемы выравнивания. –

+0

0x00f28daa нет на карте. Уверен, что это указатель, полученный с помощью арифметики указателя и/или указателя, и указывает на некоторые данные либо в разделе данных (включая родату и bss), либо в стеке или в куче. Запустите код в отладчике. Вы быстро обнаружите проблематичное место. –

+0

Другая возможность заключается в том, что у вас есть неинициализированный или испорченный указатель. –

Смежные вопросы