다음을 통해 공유


모호한 중단점 확인

이제 디버거 엔진 버전 10.0.25310.1001 이상에서 모호한 중단점 확인이 지원됩니다.

모호한 중단점을 사용하면 디버거가 중단점 식이 여러 위치로 확인되는 특정 시나리오에서 중단점을 설정할 수 있습니다. 예를 들어 다음과 같은 경우에 발생할 수 있습니다.

  • 함수의 여러 오버로드입니다.
  • 중단점 식과 일치하는 여러 기호가 있습니다.
  • 여러 위치에 동일한 기호 이름이 사용됩니다.
  • 기호가 인라인되었습니다.
  • 원본 창에서 여러 인스턴스화를 사용하여 템플릿 함수에서 중단점을 설정합니다.

사용하도록 설정하면 디버거는 지정된 중단점 식에 대한 각 기호 일치에 중단점을 설정합니다. 또한 디버거는 특정 조건이 충족되는 경우 기호 일치를 필터링합니다.

중단점 사용에 대한 일반적인 내용은 중단점 사용을 참조 하세요.

모호한 중단점 확인 사용

기본적으로 모호한 중단점은 사용하지 않도록 설정됩니다. 디버거 세션에서 이를 사용하도록 설정하려면 WinDbg 콘솔에서 다음 명령을 실행합니다.

dx @$debuggerRootNamespace.Debugger.Settings.EngineInitialization.ResolveAmbiguousBreakpoints = true;

모호한 중단점 설정이 활성 상태인지 확인하려면 다음을 수행합니다.

0:010> dx @$debuggerRootNamespace.Debugger.Settings.EngineInitialization.ResolveAmbiguousBreakpoints
@$debuggerRootNamespace.Debugger.Settings.EngineInitialization.ResolveAmbiguousBreakpoints                 : true

dx 명령 사용에 대한 자세한 내용은 dx(디버거 개체 모델 식 표시)를 참조하세요.

이 기능을 사용하지 않도록 설정하려면 위의 값을 false.로 설정합니다. 설정이 세션 간에 유지되도록 하려면 클릭한 File -> Settings -> Debugger Settings 다음 표시된 Persist engine settings across debugger sessions상자를 검사 합니다.

사용량은 단일 중단점에 적용됩니다.

모호한 중단점 식 해결은 중단점 명령을 실행하여 디버거에서 단일 중단점을 설정하는 경우에만 적용됩니다. 즉, 명령을 사용하여 여러 중단점을 bm 설정하면 평소와 같이 계속 작동합니다. 이 기능을 사용하도록 설정하여 명령을 실행하면 단일 중단점에 대한 새로운 중단점 동작이 발생합니다.

중단점 명령에 대한 일반적인 내용은 bp, bu, bm(중단점 설정)을 참조하세요.

계층적 중단점

계층적 중단점은 모호한 중단점 식을 여러 중단점으로 확인한 결과를 나타냅니다. 식에서 중단점을 설정하는 데 사용할 두 개 이상의 일치 항목이 발생하는 경우 중단점 집합을 제어하는 다른 중단점이 만들어집니다. 이 재정의 중단점인 계층적 중단점은 일반적인 중단점과 마찬가지로 사용/비활성화/지워지고 나열될 수 있으며, 소유하는 중단점에서 동일한 작업을 수행하는 기능이 추가되었습니다.

예를 들어 명령 bp foo!bar 이 실행되어 기호 bar에 대해 두 개의 일치 항목이 발생하는 경우 두 일치 항목을 제어하는 계층적 중단점이 만들어집니다. 계층 구조가 사용/비활성화/지워지면 일치하는 중단점도 마찬가지입니다.

.bpcmds(중단점 표시 명령)에는 각 중단점을 설정하기 위해 실행할 수 있는 중단점 명령이 나열됩니다. 계층적 중단점이 소유한 중단점은 주소에 중단점을 설정하는 유효한 bp 명령을 계속 나열합니다. 계층적 중단점도 출력에 나열되며 단일 중단점이 아닌 전체 중단점 집합을 다시 만드는 데 사용할 수 있는 명령이 표시됩니다.

모호한 기호

기호 이름에 중단점을 설정하면 기호가 다음과 같은 동작이 발생합니다.

  • 오버로드: 기호와 일치하는 각 오버로드에는 중단점이 있어야 합니다.

  • 템플릿 함수:

    • 식에 지정된 모든 템플릿 매개 변수가 있는 경우(예: bp foo!bar<int>) 템플릿 함수의 특정 구현에 중단점이 설정됩니다.

    • 식에 형식 구현이 지정되지 않은 경우(예: bp foo!bar) 중단점이 설정되지 않습니다. 이 경우 bm 템플릿 함수에 중단점을 설정하는 데 사용해야 합니다.

    • 부분 템플릿 사양은 디버거에서 지원되지 않으며 이 경우 중단점이 설정되지 않습니다.

  • 인라인 함수: 인라인된 각 위치에 중단점이 있습니다.

기호 식에 디버거에서 더 많은 평가가 필요한 연산자 또는 오프셋이 포함된 경우 여러 중단점이 설정되지 않습니다. 예를 들어 기호 foo 가 여러 위치로 확인되지만 식 foo+5 이 평가되는 경우 디버거는 중단점을 설정할 모든 위치를 확인하려고 시도하지 않습니다.

중단점 코드 예제

다음 코드 조각이 제공됩니다.

class BikeCatalog
{
public:
    void GetNumberOfBikes()
    {
        std::cout << "There are 42 bikes." << std::endl;
    }
    int GetNumberOfBikes(int num)
    {
        std::cout << "There are " << num << " bikes." << std::endl;
        return num;
    }
}; 

명령을 bu BikeCatalog::GetNumberOfBikes 호출하면 각 오버로드에 대해 하나씩 두 개의 중단점이 생성됩니다. 중단점을 나열하면 다음과 같은 출력이 생성됩니다.

0:000> bl
     2 e Disable Clear  <hierarchical breakpoint>     0001 (0001)  0:**** {BikeCatalog!BikeCatalog::GetNumberOfBikes}
         0 e Disable Clear  00007ff6`c6f52200  [C:\BikeCatalog\BikeCatalog.cpp @ 13]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::GetNumberOfBikes
         1 e Disable Clear  00007ff6`c6f522a0  [C:\BikeCatalog\BikeCatalog.cpp @ 9]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::GetNumberOfBikes

모호한 소스 줄

원본 줄에 중단점을 설정하면 원본 줄이 다음과 같은 동작을 발생합니다.

  • 컴파일러 최적화 함수: 컴파일러 최적화로 인해 여러 위치에서 줄이 분할되는 경우 지정된 줄에 해당하는 함수 내의 가장 낮은 위치에 중단점이 설정됩니다.
  • 인라인 함수: 지정된 줄이 인라인 처리의 일부로 최적화되지 않은 한 각 호출 사이트에 대해 중단점이 설정됩니다.
  • 여러 위치로 해결됨: 위의 조건이 충족되지 않으면 다음 조건이 있는 각 주소에 대해 중단점이 설정됩니다.
    • 식에 소스 줄과 일치하는 N 주소 집합이 있고 이러한 N 주소의 하위 집합 M이 식의 원본 줄에서 원본 줄 변위가 0이면 M 주소에만 중단점이 있습니다.
    • 식의 원본 줄에서 원본 줄 변위가 없는 N 주소 집합에 주소가 없으면 모든 N 주소에 중단점이 있습니다.

기호 인덱스 기반 필터링

각 기호에는 고유한 기호 인덱스가 있어야 합니다. 기호 구조에 대한 자세한 내용은 SYMBOL_INFO 구조를 참조하세요.

디버거는 기호 인덱스를 사용하여 원본 줄 변위가 없는 여러 주소가 있는 경우 중복 일치 항목이 필터링되도록 합니다.

템플릿 및 오버로드된 함수의 예

템플릿 함수

템플릿 함수의 정의에 대한 원본 줄에 중단점을 설정하면 템플릿 함수의 각 구현에 대한 중단점이 발생합니다. 줄 19에서 다음 템플릿 함수가 BikeCatalog.cpp지정된 경우:

template <class T>
void RegisterBike(T id)
{
    std::cout << "Registered bike " << id << std::endl;
}

그리고 그 사용법은 다음과 같습니다.

catalog.RegisterBike("gravel bike");
catalog.RegisterBike(1234);

명령을 bp `BikeCatalog.cpp:19` 호출하면 파일의 뒷부분에서 사용되는 템플릿 함수의 구현으로 확인되는 두 개의 중단점이 설정됩니다. 대신 사용자가 함수에 단일 중단점을 설정하려는 경우 템플릿 함수 구현의 특정 소스 줄에 중단점을 설정하거나 적절한 형식 정보(예: bp BikeCatalog::RegisterBike<int>)를 사용하여 템플릿 함수의 기호에 중단점을 설정해야 합니다.

중단점을 나열하면 다음 출력이 생성됩니다.

0:000> bl
     2 e Disable Clear  <hierarchical breakpoint>     0001 (0001)  0:**** {BikeCatalog!BikeCatalog::RegisterBike&lt;int&gt;}
         0 e Disable Clear  00007ff7`6b691dd0  [C:\BikeCatalog\BikeCatalog.cpp @ 20]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::RegisterBike<int>
         1 e Disable Clear  00007ff7`6b691e60  [C:\BikeCatalog\BikeCatalog.cpp @ 20]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::RegisterBike<char const *>

오버로드된 함수

오버로드된 함수의 정의에 대한 원본 줄에 중단점을 설정하면 오버로드된 함수의 정의에 중단점이 하나만 발생합니다. 위의 코드 조각을 다시 사용하며 첫 번째 줄은 줄 5에서 시작됩니다.

class BikeCatalog
{
public:
    void GetNumberOfBikes()
    {
        std::cout << "There are 42 bikes." << std::endl;
    }
    int GetNumberOfBikes(int num)
    {
        std::cout << "There are " << num << " bikes." << std::endl;
        return num;
    }
}; 

명령을 bp `BikeCatalog.cpp:9` 호출하면 줄에 단일 중단점이 voidGetNumberOfBikes설정됩니다. 중단점을 나열하면 다음 출력이 생성됩니다.

0:000> bl
     0 e Disable Clear  00007ff7`6b691ec0  [C:\BikeCatalog\BikeCatalog.cpp @ 9]     0001 (0001)  0:**** BikeCatalog!BikeCatalog::GetNumberOfBikes

인라인 함수

인라인 함수의 호출 사이트에 대한 원본 줄에 중단점을 설정하면 동일한 함수에 다른 호출 사이트가 있더라도 해당 특정 호출 사이트에 하나의 중단점만 발생합니다.

여러 계층적 중단점

계층적 중단점은 다음을 수행하지 않는 한 해당 집합의 모든 중단점을 소유합니다.

해당 집합의 중단점이 지워집니다.

  • 계층적 중단점이 지워집니다.
  • 이 계층적 중단점 집합에 중단점을 포함하는 또 다른 계층적 중단점이 만들어집니다.

이에 대해 생각해 볼 수 있는 또 다른 방법은 중단점에 하나의 계층적 중단점 소유자만 있을 수 있으며 가장 최근의 중단점 명령이 중단점 목록의 상태를 결정한다는 것입니다.

또한 계층적 중단점은 다른 계층적 중단점을 소유할 수 없습니다.

기존 중단점 하위

중단점 A가 자체적으로 존재하고 모호한 중단점 식이 확인되어 중단점 A, B를 만드는 경우 A는 B포함된 새 중단점 집합에 포함됩니다.

하위 계층적 중단점 집합 교차점

계층적 중단점 A가 중단점 B, C소유하는 경우 모호한 중단점 식이 확인되어 중단점을 만듭니다.

  • B, C, D: 중단점 B, C는 중단점 D를 사용하여 새 계층적 중단점 그룹에 조인하고 계층적 중단점 A는 지워지게 됩니다.

  • C, D 또는 B, D: 중단점 중 하나는 중단점 D사용하여 새 계층적 중단점 그룹에 조인하고, 계층적 중단점 A는 새 그룹에 조인하지 않은 다시 기본 중단점과 함께 계속 존재합니다.

참고 항목

중단점 사용

중단점 구문

bp, bu, bm(중단점 설정)

해결되지 않은 중단점(부 중단점)