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.