2017-02-06 4 views
0

ARM Cortex-M4 (Thumb)에서 오류 처리기를 실행하면 오류가 발생하기 직전에 CPU 레지스터의 스냅 샷이 생성됩니다. 이 정보로 스택 포인터를 찾을 수 있습니다. 자, 내가 원하는 것은 그것이 통과 한 모든 기능을 역 추적하는 것입니다. 여기서 볼 수있는 유일한 문제는 프레임 포인터가 없다는 것이므로 어떤 서브 루틴이 LR을 무한히 저장 한 곳을 실제로 볼 수는 없습니다.ARM cortex-M4의 스택 추적

프레임 포인터를 r7에서 사용할 수없는 경우 어떻게이 문제를 해결할 수 있습니까?

+0

코드를 분해하고 스택에 무엇이 있는지 확인하십시오. –

+0

어떤 디버거를 사용하고 있습니까? Keil Uvision에서 호출 스택을 사용할 수 있다는 것을 알고 있습니다. 너 어떤 종류의 함정을 걷고 있니? –

+0

@KooroshHajiani 디버거를 사용하지 않고 타겟이 무료로 실행 중이며 로깅 (printf 스타일) 기능이 있습니다. – Evert

답변

0

This blog post은 MIPS 아키텍처를 참조하여이 문제를 설명합니다.이 원칙은 ARM 아키텍처에 쉽게 적용 할 수 있습니다.

  • 을 계산하는 (하지 실행 이미지에 포함) 컴파일러 생성 된 디버그 정보를 사용하여 다음 단락에서

    는, 주어진 SP 및 PC를위한 스택 프레임의 위치에 대한 세 가지 가능성을 설명한다.

  • 컴파일러에서 생성 된 스택 풀기 (예외 처리) 정보 (실행 가능 이미지에 포함)를 사용하여이를 계산합니다.
  • 스택 포인터를 조정하는 프롤로그 또는 에필로그 코드를 찾기 위해 호출 사이트를 검색하고 그로부터 스택 프레임 주소를 추론합니다.

분명히 매우 컴파일러 및 컴파일러 옵션에 의존하며 모든 경우에 작동하는 것은 아닙니다.

+0

스택 추적을 조사하기 위해 (gnu) 도구를 사용하려고 시도하는 것에 대해 SO에서 수많은 cortex-m 질문이 있습니다. 코드를 살펴보고 스택을 푸는 방법 (디스 어셈블리 및 현재 pc 및 sp 값)을 알기 위해 코드의 위치를 ​​살펴보십시오. –

+0

@old_timer : 세 번째 기법은 OP별로 프로그래밍 방식으로 수행하지만 수동 검사는 동일한 원칙을 적용합니다. – Jeremy