2016-06-29 2 views
3

에서 사용하지 않는 함수를 호출, 나는 다음과 같은 코드가 있습니다 :C++ - LLVM과 lldb와 OSX에서 작업 디버거

#include <stdio.h> 
class A{ 
public: 
    void f() __attribute__((noinline)) 
    { 
     printf("f()\n"); 
    } 

    void g() __attribute__((noinline)) 
    { 
     printf("g()\n"); 
    } 

}; 

int main() 
{ 
    A a; 
    a.g(); 
    return 0; 
} 

) (주 깨고, 디버거에서 p a.f()를 호출하려고 내가 얻을 :

error: Couldn't lookup symbols: __ZN1A1fEv

p g.f()을 호출하는 것이 효과적입니다.

나는 f()를 최적화 할 수 있지만이 최적화를 비활성화하는 방법이 있다는 것을 알고 있으므로 어쨌든 디버거에서 사용할 수 있습니까?

감사합니다.

+0

'main()'에 어딘가에, 예를 들어,'f ('; – lorro

+0

컴파일러 명령 행 최적화 스위치 또는 IDE 컴파일러 설정을 확인하십시오. 실질적으로 모든 기존 컴파일러는 최적화를 비활성화 할 수 있습니다. – Ari0nhh

+1

빠른 해킹으로 '가상'메소드를 만들 수 있습니다. – pts

답변

1
는 클래스 외부 f의 정의를 이동

:

이 GCC 4.8.4 리눅스에 $ g++ t.cc$ g++ -g t.cc과 나를 위해 일했다
#include <stdio.h> 
class A { 
public: 
    void f(); 
    void g() __attribute__((noinline)) 
    { 
     printf("g()\n"); 
    } 
}; 
void A::f() 
{ 
    printf("f()\n"); 
} 
int main() 
{ 
    A a; 
    a.g(); 
    return 0; 
} 

. 툴 체인에서도 잘 작동합니다. echristo의 대답에 설명 된대로 대안으로

$ g++ t.cc 
$ nm a.out | grep _ZN1A 
000000000040052e T _ZN1A1fEv 
0000000000400562 W _ZN1A1gEv 

, f의 속성에 used을 추가하고, 클래스 내부에 보관하십시오. 그것은 또한 $ 작동 g ++ t.cc and $ g ++ -g t.cc` :

$ g++ -g t.cc 
0000000000400548 W _ZN1A1fEv 
0000000000400560 W _ZN1A1gEv 

used를 추가하는 것도 g++ -O2 -g t.cc와 함께 작동합니다.

2

정의를 줄 바르게 이동하면 어떤 경우 도움이 될 수 있지만 모든 경우에 도움이되지는 않습니다. odr C++ 멤버 함수가 아니라 정적 함수이거나 전체 프로그램이 LTO 최적화되고 함수가 로컬 변환 단위 외부에서 참조되지 않은 경우.

그런 경우에는 함수를 사용하고 컴파일러에게 결과 개체 파일에 코드를 생성하고 생성하도록 컴파일러에 알려주기 위해이 함수를 __attribute__((used))으로 표시해야합니다. 그 디버그 정보도 생성됩니다.

#include <stdio.h> 

class A { 
public: 
    void f() __attribute__((noinline, used)) 
    { 
    printf("f()\n"); 
    } 

    void g() __attribute__((noinline)) 
    { 
    printf("g()\n"); 
    } 

}; 

int main() 
{ 
    A a; 
    a.g(); 
    return 0; 
} 

__attribute__((used))가 디자인 된 이유 중 하나입니다 이것에 대한

귀하의 최종 코드처럼 보이는 끝날 것입니다. gcc documentation에서 :

This attribute, attached to a function, means that code must be emitted for the function even if it appears that the function is not referenced. This is useful, for example, when the function is referenced only in inline assembly. When applied to a member function of a C++ class template, the attribute also means that the function is instantiated if the class itself is instantiated.

이 함수가 그것을 사용하지 않는 경우에도 모든 경우에 방출이 보장된다는 것을 의미합니다.

(내가 LTO 최적화를 위해 실제로 작동 할 것이라는 점을 확인하지는 못했지만, 아마 그렇게해야 할 것입니다.하지만 저는 생각할 때가 아니라는 생각이 들었습니다. 지금 나는 LTO에서 일하고있다.

+0

위대한,이 옵션을 사용하여 내 대답을 확장했습니다. – pts

+0

나는 이런 종류의 문제를 해결하기 위해 라인 정의를 사용하지 않는 것이 좋습니다. 프로그램에 대한 폭 넓은 범위의 영향을 미치며 LTO 또는 기타 다른 모듈 간 최적화 유형으로 인해 여전히 손상 될 수 있습니다. 이 사용 사례는 __attribute __ ((used))가 생성 된 이유 중 하나입니다. 나는 좀 더 설명 할 나의 대답을 업데이트 할 것이다. – echristo