Visual Studio의 사용하는 디버깅 기능

내가 실제로 많이 쓰는 기능들 정리

종단점 세팅

  • Condition BreakPoint : breakpoint에 조건문걸어서 해당 조건 만족시 break 걸리도록 설정

breakpoint-settings.png

Dissasembly view

크래시 분석시엔 특히 항상 아래 사진처럼 옆에 놓고 쓰는 편

어셈에도 종단점 설정이 따로 가능하고 cpp 창이랑 한줄씩 실행을 둘다 돌아가면서 할 수 있어서 편함

또한 release모드에서는 코드가 디버그랑 조금 다르기때문에 확인이 필요해서 그 때문에 창 띄워놓음

그리고 코드가 의도대로 최적화 되었는지 확인

코드를 한줄로 겹쳐써서 디버깅시에 브레이크 포인트로 원하는 값이나 위치를 제대로 못 찍는 경우 욕하면서 디스어셈블로 브레이크 포인트를 찍어서 파악한다. 함수 정의 자체를 한줄로 해놓은경우 함수 break 찍은다음에 디스어셈블로 push문 지나면 정상적으로 함수 라인 안으로 콜스택이 들어가서 정보를 파악할 수 있다.

제발 한 줄에다가 겹쳐짜는건 안했으면 좋겠다.

Untitled

실행포인터 이동 :

단순히 다음 실행될 명령어를 이동하는거라 뒤로 돌아가는게 롤백(변수값등이 바뀌지않음) 기능이 아님

잘못하면 의도하지않은 상태에서 다음 명령어가 실행되서 크래시가 날 수 있음

디버깅하다가 지나쳐서 다시 로직 돌려보고싶을때 애용

dbg-basics-example3.gif

  • 변수창 : 조사식

Data BreakPoint

주소영역 범위를 8byte까지 지정해서 그 영역이 변경될때 breakpoint를 걸어줌

이 변수를 지정해서 변경될때 알려줘 →

실제 내부 동작이 해당 변수의 주솟값의 영역을 정해서 그 사이 변경시 break 걸도록했다.

그렇기때문에 실제 변수만 등록이 가능한게아니고 주소만 집어넣으면 가능함.

ex : 0x100, data size 8byte 이렇게 집어넣으면 0x100 ~ 0x107 번지 사이에 값이 변경시 break.

이거 활용할 줄 알고 모르고가 평소의 디버깅에서 속도차이를 엄청나게 보인다.

보통 문제의 시작점이 어떤 변수의 값이 잘못된것에서 시작하기때문

그러고나서 break 걸린부분을보면 온갖 이상한 콜스택의 memset에서 밀린다던가 하는 식으로 발견되는 케이스가 종종 있음

Data break없이는 파악자체가 불가능한 케이스

managed-data-breakpoint.png

  • Hot Reload (Edit and Continue)

이것도 꽤나 편한데 cpp 파일의 몇 천 줄 넘어가는 코드 베이스가 큰 경우 적용이 오래걸린다는 단점이 있음

HRShort.gif

메모리 뷰

메모리 침범, 긁는 케이스 디버깅시 필요

없으면 파악이 힘들다.

값 변경시에 빨간색으로 표시해줌

Untitled

레지스터

평소에 잘 쓰진않는데 진짜 어셈 길게 봐야할때 켜놓고 참조

Untitled

멀티 스레드

Threads

Untitled

thread 상세 콜스택까지 확인가능

  • 크래시 덤프 분석시 다른 스레드의 콜스택, 변수 상황을 파악하기위해 굉장히 많이사용

parallel Stacks

Untitled

전체 스레드 구조를 한눈에 파악하기 굉장히 용이

이런 기능들 때문에, VS 생태계 자체를 벗어나서 언어를 만지거나 코드작업을 하고싶어지지 않아진다. 없으면 살수없는 몸이 되버렸다.

https://learn.microsoft.com/en-us/visualstudio/debugger/using-the-parallel-stacks-window?view=vs-2022

https://learn.microsoft.com/en-us/visualstudio/debugger/using-breakpoints?view=vs-2022

Posted 2024-04-25