Visual Studio 디버거를 사용하여 값이 변경되면 중단


198

변수에 시계를 배치하고 해당 값이 변경 될 때만 Visual Studio가 중단되는 방법이 있습니까?

까다로운 상태 문제를 훨씬 쉽게 찾을 수 있습니다.

이것을 할 수 있습니까?

중단 점 조건에는 여전히 중단 점 세트가 필요하며 시계를 설정하고 Visual Studio에서 상태 변경시 중단 점을 설정하도록합니다.


그러나 조건이 유지되지 않는 한 중단 점은 아무 영향을 미치지 않으므로 (세터와 같은) 중단 점을 어디에서나 가져갈 수 있습니다. 아니면 뭔가 빠졌습니까?
— Oskar

6
잘. vb6 디버깅 방식과 같습니다. 중단 점 위치는 신경 쓰지 않습니다. 단지 시계 창으로 조건식을 추가하고 VB6는 조건이 충족 될 때마다 중단됩니다 것은 보증합니다 ..
— 굴자는 나짐

죄송합니다. 세터가가는 길을 아는 한, 길을 보지 못했습니다.
— Oskar

1
나는 더 좋은 소식을 찾기를 바랐다. vs2010은 변경 사항 없음 msdn.microsoft.com/en-us/library/350dyxd0.aspx를 나타냅니다. 네이티브 c ++에만이 @Scottgu가 있으므로 더 잘 수행 할 수 있습니다!
— gerryLowry

답변:


134

Visual Studio 2005 메뉴에서 :

디버그 -> 새로운 중단 점 -> 새로운 데이터 중단 점

시작하다:

&myVariable

38
관리 코드에 사용할 수 있습니까? C # 프로젝트에서이 옵션이 비활성화되어 있습니다. 어딘가에서 읽는 것은 특히 가비지 수집기가 포함 된 관리되는 앱을 디버깅 할 때 구현하기 어려운 기능입니다.
— Gulzar Nazim

27
불행히도 관리되지 않는 코드에만 사용할 수 있습니다. msdn.microsoft.com/en-us/library/350dyxd0.aspx
— Josh Kodroff

17
필드를 속성으로 일시적으로 변환하고 getter 또는 setter에 중단 점을 둘 수도 있습니다.
— Jon Davis

12
"디버그-> 새 중단 점"아래의 "데이터 중단 점"옵션이 비활성화되어 있습니다. 어떤 이유가 있습니까? 실제로 디버깅 여부에 관계없이 비활성화 상태로 유지됩니다. Visual Studio 2015를 사용하고 있습니다.
— jbb

2
조금 늦었지만 @jbb는 디버깅하는 동안 중단 점에서 멈출 때만 활성화됩니다.
— Allball103

27

코드에서 명시 적으로 중단하도록 선택할 수도 있습니다.

// Assuming C#
if (condition)
{
    System.Diagnostics.Debugger.Break();
}

MSDN에서 :

디버거 브레이크 : 디버거가 연결되어 있지 않으면 사용자에게 디버거를 연결할지 묻는 메시지가 표시됩니다. 그렇다면 디버거가 시작됩니다. 디버거가 연결되어 있으면 디버거에 사용자 중단 점 이벤트가 표시되고 디버거는 마치 디버거 중단 점에 도달 한 것처럼 프로세스 실행을 일시 중단합니다.

그러나 이것은 단지 폴백입니다. 다른 의견에서 설명한 것처럼 Visual Studio에서 조건부 중단 점을 설정하는 것이 더 좋습니다.


2
FWIW, 편집하고 계속해서 나는 이렇게하는 것을 선호합니다 : IME, 조건부 중단 점은 sloooow입니다
— Mark Sowul

이것은 효과가 있지만 매우 고통 스럽습니다. 유사한 일을 끝내 었습니다. 내가 의심했던 모든 방법의 맨 위에 놓았습니다. 그리고 마지막으로 (마지막 절에서) 다시 말해서 정확히 메소드가 문제를 일으켰습니다. (즉, 메소드에 들어가기 전에 데이터가 좋았다가 종료하기 전에 나쁘다는 것을 알고있었습니다).
— BrainSlugs83

26

정말 오래된 게시물이지만 누군가 알지 못하는 경우 ...

에서 비주얼 스튜디오 2015 , 당신은에 중단 점을 배치 할 수 있습니다 set자동 구현 속성의 접근 및 디버거는 속성이 업데이트 될 때 중단됩니다

public bool IsUpdated
{
    get;
    set;    //set breakpoint on this line
}

최신 정보

대안 적으로; @AbdulRaufMujahid은 자동 구현 속성은 한 줄에있는 경우, 당신은 위치에 커서를 할 수 있다는 의견에서 지적 get;이나 set;와 충돌 F9및 중단 점을 따라 배치됩니다. 좋은!

public bool IsUpdated { get; set; }

5
자동 구현 속성이 한 줄에 있더라도 (예 : 공개 문자열 UserName {set; 가져 오기; }. 사용자는 getter 또는 setter를 강조 표시하고 F9를 눌러 중단 점을 추가 할 수 있습니다.
— Abdul Rauf

트윗 담아 가기
— Craig

13

다음 선언을 가진 A라는 클래스가 있다고 가정하십시오.

class A  
{  
    public:  
        A();

    private:
        int m_value;
};

누군가 "m_value"값을 수정할 때 프로그램을 중지하려고합니다.

클래스 정의로 이동하여 A의 생성자에 중단 점을 두십시오.

A::A()
{
    ... // set breakpoint here
}

프로그램을 중지하면 :

디버그-> 새로운 중단 점-> 새로운 데이터 중단 점 ...

주소 : & (this-> m_value)
바이트 수 : 4 (int는 4 바이트이므로)

이제 프로그램을 재개 할 수 있습니다. 값이 변경되면 디버거가 중지됩니다.

상속 된 클래스 나 복합 클래스에서도 동일한 작업을 수행 할 수 있습니다.

class B
{
   private:
       A m_a;
};

주소 : & (this-> m_a.m_value)

검사하려는 변수의 바이트 수를 모르는 경우 sizeof 연산자를 사용할 수 있습니다.

예를 들면 다음과 같습니다.

// to know the size of the word processor,  
// if you want to inspect a pointer.
int wordTam = sizeof (void* ); 

"Call stack"을 보면 변수 값을 변경 한 함수를 볼 수 있습니다.


1
내가 찾고있는 것이 내 수업에 없다면 정확히 어떻게 할 것입니까? 예를 들어 컨트롤이 활성화 또는 비활성화되는 위치를 정확히 찾으려고합니까? 디버깅 중에 컨트롤의 Enabled 값에 시계를 추가 할 수는 있지만 변경시 중단하고 중지 된 위치를 확인할 수있는 방법은 없습니다.
— Nyerguds

2
외부 라이브러리를 디버그하려고하면 디버그 모드로 컴파일 된 라이브러리가 필요합니다. 구성 요소에 익숙하지 않지만 "콜백"을 속성에 연결하고 중단 점을 내부에 넣을 수 있습니다. 내가 설명하는 양식에는 메모리 주소가 필요합니다. 알 수있는 방법이 없으면 다른 방법을 검색해야합니다.
— momboco

9

변수를 속성으로 변경하고 set 메소드에서 중단 점을 추가하십시오. 예:

private bool m_Var = false;
protected bool var
{
    get { 
        return m_var;
    }

    set { 
        m_var = value;
    }
}

3

WPF를 사용하는 경우 WPF Inspector 라는 멋진 도구가 있습니다.
WPF 앱에 연결되어 모든 속성으로 컨트롤의 전체 트리를 표시하며 속성 변경 사항을 위반 할 수 있습니다.

그러나 슬프게도 나는 당신이 어떤 속성이나 변수로 똑같이 할 수있는 도구를 찾지 못했습니다.



2

중단 점을 마우스 오른쪽 버튼으로 클릭하면 나에게 잘 작동합니다 (주로 특정 변수 값의 조건부 중단 점에 사용하고 있지만 스레드 이름과 관련된 표현식을 중단해도 스레딩 문제를 발견하려는 경우 매우 유용합니다).


2

Peter Mortensen은 다음과 같이 썼습니다.

Visual Studio 2005 메뉴에서 :

디버그-> 새로운 중단 점-> 새로운 데이터 중단 점

입력 : & myVariable

추가 정보:

분명히, 시스템은 메모리에서 어떤 주소를보아야하는지 알아야합니다. 따라서 정상적인 중단 점을 초기화 myVariable(또는 myClass.m_Variable)로 설정하십시오. 시스템을 실행하고 중단 점에서 멈출 때까지 기다리십시오. -이제 메뉴 항목이 활성화되었으며을 입력하거나을 입력 &myVariable하여 인스턴스를 볼 수 있습니다 &myClass.m_Variable. 이제 주소가 잘 정의되었습니다.

이미 주어진 해결책을 설명하여 잘못했을 때 죄송합니다. 그러나 의견을 추가 할 수 없었으며 이에 관한 의견이있었습니다.


1

관리되지 않는 코드에서 메모리 감시 점을 사용할 수 있습니다. 그러나 관리 코드에서 사용할 수 있는지 확실하지 않습니다.


1

DebugBreak () 함수를 영리하게 사용할 수 있습니다 .


정확히? 단단한 루프에서 별도의 스레드를 실행하고 변경이 발생할 때마다 DebugBreak ()를 호출하면?
— nalply

@nalpy 예를 들어 myVariable사용 된 위치를 추적하고 사용 후 보조 previousValue변수 에 값을 저장 한 다음 myVariable!=previousValue; 그러면 어떤 코드 블록 myVariable이 변경 되었는지 알 수 있습니다 . 그러나 AShelly의 솔루션이 가장 좋습니다.
— wip

1

선택적으로 변수에 = 연산자를 오버로드 할 수 있으며 특정 조건에서 오버로드 된 함수 내에 중단 점을 둘 수 있습니다.


1

2019 년 업데이트 :

이는 현재 .Net Core 3.0 이상의 Visual Studio 2019 Preview 2에서 공식적으로 지원됩니다. 물론 IDE의 Preview 버전을 사용할 경우 잠재적 인 위험에 대해 몇 가지 생각을해야 할 수도 있습니다. 가까운 시일 내에 공식 Visual Studio에 포함될 것이라고 생각합니다.

https://blogs.msdn.microsoft.com/visualstudio/2019/02/12/break-when-value-changes-data-breakpoints-for-net-core-in-visual-studio-2019/

다행히 데이터 중단 점은 이제 Visual Studio 2019 Preview 2에서 .NET Core (3.0 이상)에서 사용할 수 있으므로 더 이상 C ++ 전용이 아닙니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.