2013-04-10 1 views
7

디버깅하는 동안 다음과 같은 오류 메시지가 나타납니다."정렬 트랩"오류 메시지의 항목 의미는 무엇입니까?

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

나는 조금 둘러 보았다이 real-time embedded website에 많은 정보를 발견했습니다. 그래서 지금은 PCInstr이 무엇을 말하는지 알고 있습니다. 그러나 나는 아직 AddressFSR 부분에 대해서는 아무 것도 발견하지 못했습니다.

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이므로 오류 발생시 r60x00f28da2으로 설정되어 있습니다.

FSR 0xf3 

는 장애 상태에 유지 값을 등록한다. 그것은 어떤 잘못이 있었는지 알려줍니다. 이 특정 값은 정렬 오류에 대한 이전 인코딩 (ARMv7 이전)입니다.

+2

한 가지 더, "Instr = 0xe5960008"이 "ldr r0, [r6, # 8]"이라는 것을 어떻게 알았습니까? objdump 실제로 그렇게 말합니다. –

+2

@NazeKimi : 방금 ARM 참조 설명서를 참조하여 디코딩했습니다. –

1

대부분의 가능성이 CPU는 /이 /에서 잘못 정렬 된 주소의 값을 메모리에 기록 읽습니다. 4 바이트 변수에 액세스하는 경우 명확하게 Address = 0x00f28daa는 4의 배수가 아닙니다. 단일 바이트 만 임의로 정렬 된 주소에서 읽고 쓸 수 있습니다.

그 기사에서는 설명이 잘되어 있습니다. 이것은 당신에게 프로그램 카운터의 현재 값을 말하고있다

+0

답장을 보내 주셔서 감사합니다. 하지만 제 질문은 분명하지 않다고 생각합니다. 나는 실제로 그 항목들이 무엇을 언급 하는지를 알고 싶었다. 메모리 주소를 읽거나 쓰고 있습니까? 이 정렬 문제를 해결하기 위해 그 주소가 무엇인지에 대한 정보가 필요합니다. –

+0

0x00f28daa는지도에 없습니다. 나는 그것이 포인터 연산 및/또는 포인터 캐스팅으로 얻은 포인터라고 생각하고 데이터 섹션 (rodata 및 bss 포함) 또는 스택이나 힙에있는 일부 데이터를 가리킨다. 디버거에서 코드를 실행하십시오. 문제가있는 곳을 빠르게 찾을 수 있습니다. –

+0

또 다른 가능성은 초기화되지 않았거나 손상된 포인터가 있다는 것입니다. –

관련 문제