2009-09-12 1 views
2

-fomit-frame-pointer가 사용되면 (다양한 -O 설정에 대해 자동) 역 추적을 수행하는 것은 문제가됩니다. 코드가이 스위치로 컴파일 된 것을 컴파일 타임에 결정하는 방법이 있는지 궁금합니다. 이 경우, #ifndef를 넣으면 잘못 알려졌을 때 백 트레이싱을 방지 할 수 있습니다.프레임 포인터가 제거되지 않는다고 판단하는 gcc 매크로가 있습니까?

이 -fomit-frame-pointer 스위치가 켜져있을 때 매크로가 설정되어 있습니까?

감사합니다, 난 그냥이 시도

답변

2

setjmp는 :

foo.c를 간단한에 "Hello World"프로그램을, 그리고 아무 결과도 얻지
 
gcc -E -fomit-frame-pointer -Wp,-dM foo.c > fpo.out 
gcc -E -Wp,-dM foo.c > no-fpo.out 
diff no-fpo.out fpo.out 

. 이것은 의 사용 여부와 상관없이 모든 전 처리기 매크로가 동일하다는 것을 의미합니다. 그래서 당신의 질문에 대한 대답은 "아니오"라고 생각합니다. -fomit-frame-pointer를 사용하는 경우

은 아마 당신이 할 수있는 최선의 (또는 빌드 프로세스가 사용하는 무엇이든) 당신의 자신의 매크로 (예를 들어 -DNO_FRAME_POINTERS, 또는 무언가)를 정의하는 Makefile을 수정합니다.

+1

최적화는 -fomit-frame-pointer를 의미하며, 이것이 주요 문제라고 생각합니다. – qrdl

+0

gcc 문서에 따르면, 최적화가 항상 프레임 포인터를 의미하는 것은 아닙니다. 이것은 아키텍처에 의존 할 수 있으며, 특정 최적화가 어떻게 디버그 기능에 영향을 미치는지에 달려 있습니다. 맨 페이지에서 : -O는 또한 디버깅을 방해하지 않는 컴퓨터에서 fomit-frame-pointer를 켭니다. –

1

컴파일 타임에는 실행할 수 없지만 런타임에 프로그램이 최적화되었는지 여부를 확인할 수 있습니다.

setjmp/longjmp으로 비 휘발성 변수를 섞어서 최적화 프로그램에서 확실히 변경 될 코드를 작성하고 해당 변수의 값을 통해 프로그램이 최적화되었는지 여부를 알 수 있습니다. -O 스위치없이 GCC 컴파일 경우

#include <setjmp.h> 
#include <stdio.h> 

int is_optimised(void) { 
    int i = 1; 
    jmp_buf jmp_loc; 

    if (setjmp(jmp_loc)) { 
     return i; // optimiser changes it to "return 1" 
    } 

    i = 0; 
    longjmp(jmp_loc, 1); 

    return 0; 
} 

int main(int argc, char *argv[]) { 
    printf("%soptimised\n", is_optimised() ? "" : "non-"); 

    return 0; 
} 

는 그것이 "optimised"인쇄 -O1-O4에 스위치 "non-optimised"인쇄한다.

물론 다른 마일리지는 다를 수 있습니다.

1

런타임에서 ebp 레지스터 (아키텍처 조정)가 스택 맨 아래 몇 바이트를 가리키는 지 확인한 다음 [ebp]에 저장된 포인터가 올바른지 확인합니다.

관련 문제