본문 바로가기
Study/Debugging

Visual studio - 조건 브레이크를 통한 디버깅

by 뿡뿡대마왕 2020. 4. 21.
반응형

방대한 양의 코드에서 Debuging을 진행할때 특정 변수의 메모리가 초기화 되거나 

 

또는 특정 문자열이 바뀐다던지.. 아니면 std::map이나 std::vector의 사이즈가 변경된다던지..

 

이런 유형의 버그를 찾기란 쉬운일이 아니다...

 

특정 변수에 대한 접근 코드가 많고 또 그것을 어떤 함수를 통해 포인터 반환값으로 그 포인터를 이용해 데이터를 변경

 

하고 있다거나.. 정말 미친듯한 멀티쓰레드에서의 접근 처리가 이뤄지고 있다면..

 

그것이야 말로 지옥이 따로 없다. -_-;

 

또한 find all로 검색시 몇천, 몇만 라인이상의 검색결과가 나올때는 정말 우울하고, 직종 변경을 다시한번 생각하게 만든다.

 

하지만 걱정하지 마라 이런 부분에 관련하여 Visual studio에서는 특정 상황에 중단점(브레이크 포인트)를 걸 수 가 있다.

 

(예전엔 정말 생으로 찾는다고 단 한줄의 수정을 위해 몇일밤을 세우거나 하는일이 부지기수 였다.. ㅜㅜ..초짜일땐.)

 

 

1. 우선 데이터가 변경시 자동으로 브레이크 포인트가 걸리게 하기 위해서는 아래와 같이 설정을 진행하면 된다.

   A) Debug항목에서 New Breakpoint -> New Data Breakpoint를 선택

 

B) New Breakpoint를 선택하면 아래와 같은 창이 출력되는데 이제 여기다가 메모리 주소를 넣고 해당 메모리주소에서 몇 바이트의 변경을 감지할 것인지를 입력하고, 실행하면 입력된 주소번지의 데이터가 변경시 자동으로 

브레이크 포인트가 걸리게 되고, 이제 Call stack을 보며 행복하게 디버깅을 진행하면 된다.

(물론 Call stack을 찾아도 그게 이제 시작일 수 있다는것은 함정..ㅠㅠ)

 

 

 

 

 


자 이제 메모리 변경시 자동으로 브레이크 포인트를 설정할 수 있는 방법은 알았다.

 

그렇다면 우리가 자주 사용하는 몇 가지 자료형 type에 대해 브레이크 포인트를 걸어보도록 하자

 

아래 부분이 사실상 자주 사용하는 부분이기 때문에 중요할 수 있다. 

 

1. std::string 에서의 문자열 변경 감지.

- std::string에서 문자열 변화를 감지하기 위해서는 실제 문자열이 있는 곳의 주소번지를 알아야 한다.

  아래를 보면 실제 문자열이 위치하는 곳의 메모리 주소 번지를 알 수 있다.

<문자열 할당 위치>

위에 처럼 접근하면 실제 문자열이 할당되어 있는 주소를 알 수 있으니 해당 주소를 New Breakpoint에 넣고

 

디버깅을 진행하면 해당 문자열이 변경되는 시점에 브레이크 포인트에 걸리므로 손쉬게 Debugging이 가능해 진다.

 

 

2. std::map 변수의 사이즈 변경 감지.

<map size>

 

std::map 변수 주소에서 16바이트 이동 후 8바이트 map의 사이즈 정보가 담긴 공간이다.

해당 메모리 주소값을 감지하면 내가 원하는 map 변수의 사이즈가 어디선가 변경될 때 바로 감지하여 디버깅을 할 수 있게 된다.!

 

 

3. std::vector 사이즈 변경 감지

<vector size>

반응형

댓글