2011-09-07 3 views
3

Linux를 실행하는 ARM9E 프로세서로 개발 중입니다. 가끔 다음과 같은 메시지가 내 응용 프로그램 충돌 :PC (ARMv5) 주소를 소스 코드에 매핑하는 방법은 무엇입니까?

[142.410000] 정렬 트랩 : rtspserverd (996) PC = 0x4034f61c 측량기는 = 0xe591300c 주소 = 0x0000000d FSR 0x001

은 어떻게 PC 주소를 변환 할 수 있습니다 실제 소스 코드에? 즉,이 메시지에서 나는 어떻게 이해할 수 있습니까?

답변

4

objdump. 실행 파일을 덤프 한 다음 4034f61c:을 검색하십시오. -x, --disassemble-l 옵션이 특히 유용합니다.

+0

나는 팔을 x86 우분투에서 크로스 컴파일 오전, 내가 알아야 할 것이 있습니까? – Eric

+0

팔 전용 objdump를 사용해야합니다. gcc를 사용한다고 가정 할 때 gcc 툴체인이 있어야합니다. '--architecture = '과'-i'는 사용 가능한 아키텍처를 나열합니다. – nmichaels

+0

또는'addr2line -e 0x4034f61c' (디버그 정보 필요). 어떤 이유로 든 – user786653

2

컴파일러에서 목록을 켜고 링커에지도 파일을 생성하도록 지시 할 수 있습니다. 맵 파일은 문제가 발생한 기능까지의 절대 주소의 의미를 알려주지 만, 목록은 함수 내에서 예외의 정확한 위치를 찾아내는 데 도움이됩니다.

gcc에서 예를 들어, 당신은

gcc -Wa,-a,-ad -c foo.c > foo.lst 

파일 foo.lst의 목록을 생성 할 수 있습니다.

-Wa,은 어셈블러 (gas)에 다음 옵션을 보냅니다.

-agas에게 표준 출력에 대한 목록을 생성합니다.

-ad에는 gas에 디버그 지시문이 생략되어 있습니다. 그렇지 않으면 많은 혼란을 일으 킵니다.

지도 파일을 생성하기위한 GNU 링커 옵션은 -M 또는 --print-map입니다. gcc으로 링크하는 경우 옵션이 -Wl,으로 시작하는 링커에 전달해야합니다 (예 : -Wl,-M).

디버거에서 애플리케이션을 실행하고 (gdb 등) bt 명령으로 충돌 후 스택 덤프를 볼 수도 있습니다.

+0

팔 도구 체인을 사용하고 있으며이 옵션이 인식되지 않는 것 같습니다. – Eric

+0

다른 컴파일러와 비슷한 것이 있어야합니다. – starblue

+0

이것은 대상 아키텍처와 독립적으로 GNU 툴체인에서 작동합니다. 방금'avr-gcc'를 확인했습니다 (정규 빌드의 일부로이 파일들을 생성하고 싶었습니다). – starblue

관련 문제