2011-03-31 5 views
0

방금 ​​Qt로 시작했고 내 생각에 매우 유용한/유용한 QMetaObject를 발견했습니다.Qt/C++의 리플렉션

이제 Qt/표준 C++ 또는 다른 C++ 라이브러리를 사용하여 함수 이름이나 현재 스택을 호출하는 것과 같은 정보를 얻을 수 있는지 궁금합니다.

디버깅/로깅 목적으로 필요합니다.

예를 들어 MethodBase.GetCurrentMethod()을 호출하여 현재 방법을 얻을 수 있습니다. 이 같은 것이 정말 편리 할 것입니다.

답변

3

좋은 형식의 함수 이름을 반환하는 PRETTY_FUNCTION 매크로가 있습니다. GCC와 다른 컴파일러에서 사용할 수 있습니다.

+0

나는 __func__' 함수 이름을 얻을 수있는 C99 표준 인'것을 알아 냈다. '__FUNCTION__'도 대부분의 컴파일러에서 작동합니다. '__PRETTY_FUNCTION__'과'Q_FUNC_INFO'는 모두 Qt와 함께 작동하고 함수 시그니처를 반환하지만, 모든 OS에서 그럴 수는 없습니다. – Karsten

1

C++에서 그렇게 할 수 있다고 생각하지 마십시오. 나는 당신이하고 싶은 것은 사용하는 로깅 매크로를 만드는 것입니다 생각 predefined macros :

__FUNCTION__ __LINE__ __FILE__ 
0

당신이 절대적으로 (그리고 컴파일러가 지원하는) 이런 종류의 물건을 수행하려는 경우 당신은 당신의 컴파일러에서 RTTI를 활성화 할 수 있습니다. 그러나 C++ 표준 (98 이전)의 원래 디자인에서는 런타임에 "메타"데이터가 정의되어 있지 않습니다.

http://en.wikipedia.org/wiki/Run-time_type_information

로깅 컴파일러 (같은 FILELINE)에 의해 정의 된 매크로를 사용하는 것이 순전히합니다. 런타임에서 좀 더 고급 기능을 원한다면 자신 만의 "메타 데이터"시스템을 만드는 것이 더 나은 계획 일 수 있다고 생각합니다 (또는 기존의 메타 데이터를 찾는 것).

+0

RTTI는 공식 C++ 표준 (이전 및 신규 모두)의 일부이며, 대부분의 컴파일러에서 기본적으로 활성화됩니다. RTTI를 지원하지 않는 컴파일러는 부적합합니다.RTTI는 때로는 임베디드 개발에서 특히 그렇습니다. –

+1

은 "표준"대신 "디자인"이라는 단어를 사용 했어야합니다. 당신은 정확하고 올바르게 수정되었습니다. –

1

이렇게하는 플랫폼에 독립적 인 방법은 없습니다. 안타깝게도 (또는 다행스럽게도 사용자의 관점에 따라) 표준 C/C++에는 그런 내성적 인 기능이 포함되어 있지 않습니다.

아래의 스택 추적을 얻는 다양한 방법에 대한 설명이 나와 있습니다.

How can one grab a stack trace in C?

당신은 아마 당신이 고객의 시스템에 설치할 수 없습니다 의미있는 스택 트레이스를 얻기 위해 디버그 기호 정보를 필요로 할 것이다.

기호 정보를 설치하지 않고 Windows에서 로그 항목의 스택을 실제로 알고 싶다면 작은 미니 덤프 파일 (MiniDumpWriteDump)을 작성할 수 있습니다. 이것은 기호없이 고객의 시스템에 저장되어 개발자 시스템에서 해당 빌드의 .pdb 기호로 분석 될 수 있습니다. 또한 로컬 변수 값을 표시하고 선택적으로 모든 프로세스 데이터를 포함 할 수 있습니다 (미니 덤프 파일을 크게 만듭니다). interweb의 아래와 다른 곳에서 더 많은 정보.

http://blogs.msdn.com/b/joshpoley/archive/2008/05/19/prolific-usage-of-minidumpwritedump-automating-crash-dump-analysis-part-0.aspx

+0

StackWalker는 매우 유망 해 보이지만 Qt에서 사용할 수 있습니까? – Karsten

+0

StackWalker는 Windows에서만 Qt에서 작동합니다. 스택 보행은 Qt와 같은 사용중인 라이브러리가 아닌 OS 및 컴파일러에만 적용됩니다. – persiflage