방대한 양의 코드에서 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 변수의 사이즈 변경 감지.
std::map 변수 주소에서 16바이트 이동 후 8바이트 map의 사이즈 정보가 담긴 공간이다.
해당 메모리 주소값을 감지하면 내가 원하는 map 변수의 사이즈가 어디선가 변경될 때 바로 감지하여 디버깅을 할 수 있게 된다.!
3. std::vector 사이즈 변경 감지
'Study > Debugging' 카테고리의 다른 글
Crash 발생 프로그램의 dump 생성 방법(Dump없이 죽는 프로그램도 해당) - procdump 사용 (3) | 2021.01.05 |
---|---|
Windbg 원격 디버깅 방법 (0) | 2014.11.03 |
소프트웨어 브레이크 포인터와 하드웨어 브레이크 포인터 (0) | 2011.09.28 |
WinDbg로 PEB 보기^^ (0) | 2011.09.28 |
- 프로세스 시작시 자동 디버깅 - (0) | 2011.09.28 |
댓글