Visual Studio 2005 C ++ 멀티 스레드 프로그램에서 기능의 항목 및 종료를 추적하는 빠른 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/238517

문제

ActiveMQ-CPP API를 사용하는 방식으로 인해 ActiveMQ 라이브러리에서 간헐적 인 충돌이 발생했습니다. 충돌로 이어지는 모든 기능을 관찰 할 수 있다면 문제를 디버깅하는 것이 훨씬 쉽습니다. Visual Studio 2005 C ++ 멀티 스레드 프로그램에서 기능의 항목 및 종료를 추적하는 빠른 방법이 있습니까?

미리 감사드립니다!

도움이 되었습니까?

해결책

트레이서 개체를 사용하십시오. 이 같은:


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");
   ...
}

다른 팁

디버거가 프로세스에 첨부되는 동안 소스 코드를 마우스 오른쪽 클릭하고 원하는 텍스트를 사용하여 "브레이크 포인트-> TracePoint 추가"를 선택할 수 있습니다 (일부 매크로도 제공).

TracePoint는 실제로 일부 메시지 프린터 기능에서 "HIT"필드가있는 중단 점이며 실제로 프로세스를 중단하지는 않습니다. 강력한 유용함을 발견했습니다. 또한 마크로 $ 함수가 있습니다. 필요한 기능을 정확하게 수행합니다.

위의 모든 옵션은 멋지고 도움을 줄 수 있습니다. 그러나 코드가 수천 개의 기능이있는 경우 마우스로 트라코 포를 설정하면 어떻게 도움이 될 수 있는지 알 수 없습니다.
이런 종류의 일은 정기적 인 프로그래밍 작업의 일부 여야합니다. 함수를 작성할 때 어떤 추적 메시지가 디버깅에 도움이 될지 생각해야합니다.
섹션 (독자 스레드, 작업자 스레드 등) 및 다른 로깅 레벨 (오류, 경고, 추적, 장방 등)에 뱉을 수있는 기존 로거를 작성/사용해야합니다. 좋은 로거는 성능을 해치지 않는 방식으로 설계되어야합니다. 이것은 일반적으로 언어에 해를 끼치지만, 문제 후에 버릴 수있는 배열에 문자열 포인터를 할당하는 것과 같이 로깅이 매우 빠르지 않으면 복잡한 동기화 문제가 일반적으로 재현 될 수 있습니다. 재현됩니다. 나는 보통 화면에 전체 트레이스가 덤프 된 상태에서 디버깅을 시작하고 운이 좋고 버그가 이런 식으로 재현되면 이미 충분한 정보가 있기 때문에 버그를 고치는 것이 사소한 일입니다. 문제를 재현하십시오.
나는 실제로 코드 쓰기보다 더 창의적이고 만족스러운 디버깅을 발견하지만 이것은 단지 나입니다 :).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top