2011-09-19 5 views
2

Vxworks + PPC 603에서 "잘못된 프로그램 카운터 주소"예외가 발생합니다.프로그램 카운터에 잘못된 주소가 발생할 수 있습니까?

응용 프로그램이 여러 'C'라이브러리에 연결됩니다. 이 문제를 일으킬 수있는 장소를 배치 할 수 없습니까?

잘못된 컴파일 옵션으로 인해이 문제가 발생할 수 있습니까?

방향 또는 포인터가 도움이 될 것입니다.

감사

UPDATE :

내가 멤버 함수 포인터 구조를 갖는입니다. 구조체 자체는 정적이며 주소가 구조체를 통해 전달되고 다른 함수가 호출됩니다.

테스트 라운드 중 하나에서 함수 포인터에서 함수 주소 값이 1 감소한 것을 발견했습니다. 함수 주소가 0x009a3730이면 PC에 0x00913729가있는 것입니다.

또한 컴파일러 옵션을 변경하면 충돌이 발생하거나 충돌이 발생하는 횟수가 변경됩니다.

+0

함수 포인터를 통해 함수 호출을 수행하고 있습니까? –

+1

아마 스택이 엉망이되어서 함수에서 돌아 왔을 때 잘못된 주소를 PC에 넣었을 것입니다. –

+0

@Oli Charlesworth, 네, 함수 포인터를 통해서만 대부분의 함수 호출을 수행하고 있습니다. – Jay

답변

0

@All, 목 추락하는 내부 함수의 지역 변수 당신의 제안에 찬성합니다.

주소가 들어있는 위치가 다른 구조의 참조 멤버를 잘못 가리키고 그 참조 멤버가 해당 구조를 해제하기 위해 호출 할 때마다 1 씩 감소하는 것으로 나타났습니다.

해당 구조의 메모리는 우리 함수 중 하나를 호출하여 할당해야합니다. 그러나 대신 어떤 초기화 또는 메모리 할당도없이 일부 garbade 메모리를 참조하도록 남겨졌고 글로벌 구조가 저장되는 정적 메모리를 참조하게되었습니다. 이로 인해 정적 구조가 손상되고 inturn이 충돌을 일으켰습니다.

로그를 철저히 분석하면 모든 자료를 하나로 묶는 데 도움이됩니다.

2

포인터 포인터 값이 손상되어 나중에 호출되면 함수 포인터로 작업하는 모든 경우 쉽게이 문제가 발생할 수 있습니다. 시그널 핸들러를 체크하고 콜백을 다루는 다른 API :

+0

멤버가 함수 포인터 인 구조체로 작업하고 있습니다. 구조 자체는 정적이며 정적 구조의 주소가 전달됩니다. 하지만, 나는 당신의 대답에 따라 이것을 해결하는 방법을 이해하지 못합니다. 정교하게 주시겠습니까? 답장을 보내 주셔서 감사합니다. – Jay

+0

@Jay : 기본적으로 함수 포인터가 손상된 곳을 찾기 위해 애플리케이션을 디버깅해야 할 것입니다. 'static' 구조체의 함수 포인터에 워치 포인트를 놓고 그것이 어디에서 수정되는지 관찰 할 수 있습니다. –

0

"함수 주소가 0x009a3730이면 PC에 0x00913729가 있습니다." 여기의 차이점은 1이 아닙니다 :) 그러나 PC는 항상 AFAIK를 실행해야하는 다음 명령어의 주소를 가리 킵니다. 에 값을 등록> -

  • 정보가 등록 충돌의 지역 주위에

    1. 돌아 가기 추적
    2. '분해'코드 :

      아마 당신은 디버거에서 코어 덤프를 실행하고 밖으로 인쇄 할 수 충돌시

    3. 정보 현지인 ->이
  • 관련 문제