2008-10-26 11 views
3

나는 activemq-cpp API를 사용하는 방식 때문에 내 ActiveMQ 라이브러리에서 간헐적 인 충돌이 발생합니다. 충돌까지 이어지는 모든 기능을 관찰 할 수 있다면 문제를 디버그하는 것이 훨씬 쉬울 것입니다. Visual Studio 2005 C++ 멀티 스레드 프로그램에서 함수의 진입 및 종료를 빠르게 추적하는 방법이 있습니까?Visual Studio 2005 C++ 다중 스레드 프로그램에서 함수의 진입 및 종료를 신속하게 추적하는 방법은 무엇입니까?

미리 감사드립니다.

답변

3

Tracer 개체를 사용하십시오. 이런 식으로 뭔가 :


class Tracer 
{ 
public: 
    Tracer(const char *functionName) : functionName_(functionName) 
    { 
    cout << "Entering function " << functionName_ << endl; 
    } 

    ~Tracer() 
    { 
    cout << "Exiting function " << functionName_ << endl; 
    } 

    const char *functionName_; 
}; 

지금 당신은 단순히 상단에 추적기 객체에게 기능을 인스턴스화 할 수 있으며, 함수가 종료와 소멸자가 호출 될 때 자동으로 ... "종료"인쇄합니다 :


void foo() 
{ 
    Tracer t("foo"); 
    ... 
} 
+0

잘못된 생각 : 출력 함수를 사용하면 cout이 잠금을 사용하기 때문에 스레드를 직렬화하는 경우가 있습니다. 이것은 찾으려고하는 문제를 파괴 할 수 있습니다. –

+0

그런 다음 cout을 fprintf (stderr, ...)로 바꿉니다. – Dima

+0

여전히 불충분하지만, 심각한 동기화 문제를 디버깅 할 때 모든 유형의 io가 위험합니다.하지만 아이디어가 올바르며 상황에 따라 출력 개체를 런타임에서 선택할 수 있습니다. – Ilya

2

디버거가 프로세스에 연결되어있는 동안 소스 코드를 마우스 오른쪽 버튼으로 클릭하고 원하는 텍스트 (일부 매크로가 제공됨)가있는 "breakpoint-> add TracePoint"를 선택할 수 있습니다.

Tracepoint는 실제로 일부 메시지 프린터 기능의 "When Hit"필드와의 BreakPoint이며 실제로 프로세스를 중단하지 않습니다. 나는 그것이 유용하다는 것을 발견했다. 매크로 $ FUNCTION은 필요한 기능을 정확히 수행한다 : 그것이있는 디버그 정보를 가지고 있다면 ... 함수를 출력하고, $ THREADID를 출력한다.

2

위의 모든 옵션이 좋으며 도움이 될 수 있습니다. 하지만 TracePoing을 마우스로 설정하면 코드에 수천 가지 기능이있는 경우 도움이 될 수 있습니다.
이런 종류의 일은 정기적 인 프로그래밍 작업의 일부 여야합니다. 함수를 작성할 때 어떤 추적 메시지가 디버깅에 도움이되는지 생각해야합니다.
섹션 (리더 스레드, 작업자 스레드 등) 및 다른 로깅 수준 (오류, 경고, 추적, 상세 정보 등)에 빠질 수있는 기존 로거를 작성하거나 사용해야합니다. 좋은 로거는 성능에 해를 끼치 지 않도록 디자인되어야합니다. 이는 일반적으로 자세한 정보를 손상 시키지만, 문제 발생 후 덤프 될 수있는 배열에 문자열 포인터를 할당하는 것과 같이 로깅이 매우 빠르지 않는 한 복잡한 동기화 문제는 일반적으로 재현 될 수 있습니다 재생산된다. 나는 보통 화면에 덤핑 된 전체 추적으로 디버깅을 시작합니다. 운좋게도 버그가 이렇게 재현 된 경우 버그가 수정되는 것은 간단합니다. 정보가 충분하기 때문에 문제가 없어지면 재미가 시작됩니다. 문제를 재현하십시오.
필자는 실제로 코드 작성보다 더 창의적이고 만족스러운 디버깅을 찾았지만 이것은 나만의 것입니다. :)

+0

교착 상태/경쟁 조건/디버깅에 초대합니다. .. 분산 된 다중 스레드 시스템에서 :) 처음부터 로깅 서비스를 설계하는 데 대한 좋은 지적이 있습니다! – xtofl

+0

로깅 서비스를 고급으로 설계 한 경우 나에게 필요하지 않습니다. :) – Ilya