조건부 중단 점이 디버그 시간에 응용 프로그램 실행 속도를 줄이는 이유는 무엇입니까?

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

문제

특정 조건을 확인하기 위해 임시 코드를 사용하는 대신 VS2005에서 조건부 중단 점을 사용하면 더 많은 시간이 걸리고 실행 속도가 줄어드는 것을 알았습니다! 왜 그런지 아십니까? 이 문제를 해결하는 방법은 무엇입니까?

exmaple :

    int sequence = atoi(m_SequenceNumber.GetAscii());
    if( sequence == 392914)//temporary code to check to step into code
    {
        int x = 0;//I put breakpoint here
    }

이전 코드는 조건부 중단 점을 사용한 것보다 더 빠르게 실행됩니다 (시퀀스 == 392914).

도움이 되었습니까?

해결책

조건부 중단 점보다 메모리 워치 포인트를 사용하는 것이 더 좋습니다. 조건부 중단 점 (다른 사람들이 지적했듯이)은 실행 포인터가 해당 지점을 지나갈 때마다 추가 코드를 실행해야합니다. 특정 유형의 메모리 워치 포인트는 특정 특수 하드웨어 레지스터를 사용하게됩니다. 가속화 될 수있는 시계점 수에 제한이 있지만 사용할 수있는 경우 속도 페널티가 거의 없습니다.

중단 점 창을 사용하여 메모리 워치 포인트가 설정됩니다. 코드 줄에 설정하지 않고 메모리 주소로 설정합니다. 이것은 명백한 한계를 암시하며, 글로벌 변수 및 동적으로 할당 된 메모리 영역 (사용 new 등). 당신은 당신이 볼 수있는 메모리의 양이 제한되어 있습니다 (CPU를 기반으로 할 수 있습니다.

나는 실제로 지금 VS 앞에 앉아 있지는 않지만 대략적으로 말하면 중단 점 창을 마우스 오른쪽 버튼으로 클릭하고 "새 데이터 브레이크 포인트"와 같은 것을 선택합니다. 그런 다음 메모리의 주소와 크기를 바이트로 입력합니다. 값이 변경 될 때마다 워치 포인트가 발사됩니다. 이것은 메모리 손상 문제를 파악하는 데 특히 유용합니다.

다른 팁

나는 과거 에도이 문제를 해결했으며 성능에 영향을 미치지 않고 큰 루프 내에서 조건부 중단 점을 계속 사용할 수있는 방법을 찾지 못했습니다. 나는 당신이 성능에 영향을 미치지 않으며 VS가 깨지는 (조건부 중단 점과 동일한 동작)와 같은 임시 코드를 삽입 할 수 있다는 것을 배웠습니다.

if ( condition ) Debugger.Break();

디버거를 작성하는 경우 조건부 중단 점을 어떻게 구현할 것인지 생각해보십시오. 디버거가 조건을 평가할 기회가있는 유일한 시간은 중단 점이 치는 시점입니다. 따라서 브레이크 포인트가 당신이 염려하는 한 조건부이지만, 프로세서가 걱정되는 한, 명령어가 실행될 때마다 중단 점이 적용됩니다. 디버거는 제어를 받고 다음을 수행합니다.

  • 중단 점이 조건부인지 결정합니다
  • 표현식을 평가합니다
  • 표현식이 거짓 인 경우 디버거는 계속 실행됩니다.
  • 그렇지 않으면 디버거가 귀하를 통제합니다

따라서 브레이크 포인트 히트를 보지 않더라도 (조건이 충족되지 않기 때문에) 디버거는 중단 점을 수용하고 수천 번 (또는 더 이상) 조건을 평가할 수 있습니다.

상태를 실행하는 데 시간이 걸리기 때문이라고 생각합니다. 필요한 숫자를 수동으로 밟는 것보다 여전히 훨씬 빠릅니다.

추가 된 임시 코드는 컴파일러에서 최적화 할 수 있습니다 (최소한 비트). 조건부 중단 점은 아마도 필요한 정보를 수동으로 검색하여 실제로 일시 중지 해야하는지 여부를 알 수 있습니다.

그것은 어떻게 든 더 많은 시간이 걸리는 이유를 설명 할 것입니다. 그러나 나는 단지 추측하고있다.

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