2009-05-28 7 views
1

"이벤트 대기열"을 사용하여 다른 스레드에서 함수를 실행하는 네이티브 C++ 프로그램이 있습니다. 나는 힙에 "이벤트"클래스를 할당하고 실행을 위해 내 스레드의 대기열 중 하나에 배치합니다.전 처리기를 사용하여 컴파일시 해시를 계산하고 저장하는 방법?

모두 훌륭하지만, 이러한 "이벤트"의 출처를 추적하는 것은 매우 어렵습니다. 나는 각 "사건"이 그것이 어디에서 왔는지에 관한 정보를 저장하고 싶다. 지금은 내재적 인 _ReturnAddress()을 사용하고 있지만 파일 이름 문자열과 줄 번호도 갖고 싶습니다. 매크로를 사용하여 내 "일정"을 예약하는 것이 좋습니다.

물론 나는 이러한 문자열을 갖는 것에 대해 가격을 지불하고 싶지 않습니다.

사전 처리기를 구축하고 덤프하여 "id"=> "file, line"의 맵을 파일로 만들 수있는 방법이 있습니까? "id"는 매크로가 확장 될 때마다 증가하는 고유 번호입니다. ? 나는이 신분을 나의 기원으로 저장할 수 있었다.

또는 런타임에 사용할 수 있도록 파일 이름의 매우 짧은 해시를 계산할 수 있습니까?

모든 아이디어를 환영합니다.

답변

4

ID를 들어 당신은 http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx에서 __COUNTER__.

을 사용할 수

그것이 compiland에 사용 때마다 0 시작하여 1 씩 증가 정수로 확장합니다.

__FILE____LINE__을 사용하여 이벤트가 할당 된 위치를 추적 할 수 있습니다.

하지만 왜 이러한 이벤트의 출처를 추적하고 싶습니까? 이것이 디버깅 목적이라면 StackWalk64를 사용하여 수집 된 스택 트레이스를 특수 디버그 모드에서 클래스에 임베드 할 수 있습니다. 원점 위치보다 훨씬 유용한 정보를 제공합니다.

+0

흥미로운 아이디어. StackWalk64를 좀 더 살펴보아야 할 것입니다. 원점을 원한 이유는 앱이 충돌 할 경우를 대비 한 추적 용도입니다. 메시지 루프 내에서는 항상 실패하기 때문에 메시지가 어디에서 왔는지 전혀 알 수 없습니다. 디버그 빌드를 추적하는 데 약간의 시간이 걸리지 만 프로덕션을 위해 뭔가를 원합니다. –

+0

그럼 StackWalk64를 확실히 살펴볼 것입니다. – Michael

3

프리 프로세서를 직접 작성하십시오.

.cpp 파일을 파싱하고 자신이 정의한 구문을 검색합니다. 그것을 찾을 때 파일 이름과 행을 추가하십시오 (전 처리기는 새로운 행의 수를 계산해야 함). 그래도 자신의 매크로를 C++로 확장해야합니다. 모든 것을 임시 파일에 기록한 다음 "실제"컴파일러로 전달합니다.

건배!

1

체크 아웃 Boost.Preprocessor 표준 C 선행 처리기로 강력한 작업을 수행하는 헤더 전용 매크로 세트입니다.

꽤 복잡합니다 (나는 그것을 이해한다고 주장하지 않습니다). 그러나 나는 그것이 당신이 원하는 것을 할 수 있다고 생각합니다. 문서 herehere