기타 기능
현재 로드된 dll 파일 리스트를 visual studio에서 보는 방법
디버그 모드로 실행 후 디버그 -> 창 -> 모듈
Visual Studio에서 작업 디렉토리를 변경하는 방법
- Open Project > Properties > Configuration Properties > Debugging.
- 작업 디렉토리는 기본적으로 $(ProjectDir) 로 세팅되어있다. 이 위치를 원하는 디렉토리로 바꿀 수 있다. 실행 파일이 있는 위치와 동일한 디렉토리를 원하는 경우 $(SolutionDir)$(Configuration)\ 로 바꾸면 된다.
빌드 후 이벤트 생성 방법
- Open Project > Properties > Configuration Properties > Build Events > Post-Build Event
- Command Line을 수정한다.
- ex) copy "$(TargetPath)" "$(SolutionDir)..\..\Data\"
- 이렇게 하여 만들어진 output을 원하는 디렉터리에 위치시킬 수 있다.
- 참고) 만들어진 output이 이미 프로그램에서 사용중이라면, 빌드이벤트에서 에러가 발생할 수 있다. 프로그램을 끄고 실행해야 한다.
스크롤 막대
메뉴 -> 도구 -> 옵션 -> 텍스트 편집기 -> C# -> 스크롤 막대
단축키
단축키 변경방법
메뉴에서 도구 -> 옵션 -> 환경 -> 키보드 순서로 다음 창을 볼 수 있다.
유용한 단축키
1. 창.다음문서창으로이동 (Ctrl + Tab (전역))
편집하고있는 창을 이동시킬 수 있다. 예를 들어 소스코드 파일을 편집하다가 다른 소스코드 파일로 이동할수 있고, 소스코드 파일에서 솔루션 탐색기로도 이동할 수 있다.
2. 편집.실행취소 (Ctrl + Z (전역))
편집중이던 내용을 되돌린다.
3. 편집.전체로이동 (Ctrl + T (전역))
코드 검색 및 소스코드 파일을 검색할 수 있고, 해당 파일 해당 위치로 이동할 수 있다.
4. C++ Source -> Header, Header -> Source (Ctrl + K + O)
C++ 편집 중 소스코드에서 헤더로, 헤더에서 소스코드로 이동할 수 있다.
5. 디버그.디버그하지않고시작 (Ctrl + F5 (전역))
프로그램을 컴파일 후 실행시킨다.
6. 디버그.시작 (F5)
프로그램을 컴파일 후 디버그로 실행시킨다.
7. 빌드.솔루션빌드 (Ctrl + Shift + B (전역))
솔루션을 빌드시킨다.
8. 파일.이창을제외하고모두닫기 (Alt + Q (전역)) (직접 생성한 단축키)
현재 포커스되어있는 창을 제외하고 모든 창을 닫는다.
이 단축키는 편의를 위해 직접 할당하였다.
9. 텍스트 편집기 - 편집.페이지위,아래로 (PgUp, PgDown)
텍스트 편집 중 커서를 페이지 단위로 이동시킨다.
10. 텍스트 편집기 - 편집.한줄위,아래선택 (Shift + 위쪽화살표, 아래쪽화살표)
한줄 단위로 텍스트를 선택한다.
11. 텍스트편집기 - 편집.다음단어로 (Ctrl + 오른쪽화살표)
단어단위로 텍스트를 선택한다.
12. 텍스트편집기 - C# 편집 중, 현재 코드의 참조 목록 보기 (Alt + 3)
C#에서 현재 커서로 선택된 코드의 참조 목록을 볼 수 있다.
13. Git.명령프롬프트에서열기 (지정된 키 없음)
Command 창을 띄운다.
14. Git.수정되지않은항목과비교 (Alt + Space) (직접 생성한 단축키)
git repository의 현재 로컬의 수정되지 않은 상태와 수정된 상태를 비교한 결과를 Visual Studio의 merge tool로 보여준다.
15. 편집.이동 (Ctrl + G (전역))
줄 번호로 이동할 수 있다.
16. 보기.작업목록 (Ctrl + \, Ctrl + T (전역))
코드 작성 시 작업목록 관리를 할 수 있다.
// TODO: blabla
17. 편집.이름 바꾸기 (Ctrl + R, Ctrl + R (전역))
선택된 이름을 바꿀 수 있다. 참조된 다른 이름들도 같이 바뀌어진다.
18. 편집. 바꾸기 (Ctrl + H (전역))
선택된 텍스트를 바꿀 수 있다.
19. 책갈피
Ctrl + K, Ctrl + K
책갈피를 지정하거나 삭제 할 수 있다.
Ctrl + K, Ctrl + W
책갈피 목록을 띄운다.
Ctrl + K, Ctrl + N
다음 책갈피로 이동한다.
Ctrl + K, Ctrl + P
이전 책갈피 로 이동한다.
20. 편집.정의피킹 (Alt + F12 (텍스트 편집기))
선택된 identifier가 정의된 영역을 현재 창을 유지한 채 볼 수 있다. (C++에서 유용함)
21. 편집.모든참조찾기 (Shift + F12)
선택된 키워드의 모든 참조를 찾는다.
22. 편집.파일에서찾기 (Ctrl + Shift + F (전역))
파일에서 입력한 텍스트를 찾는다.
23. 편집.다음위치로이동 (F8 (전역))
다음 위치로 이동한다. 모든참조찾기나 모두찾기를 통해 찾은 목록창이 나오면 목록에서 순차적으로 항목들을 이동할 수 있다.
24. 편집.이전위치로이동 (Shift + F8 (전역))
이전 위치로 이동한다.
25. 편집.정의로이동 (F12 (전역))
코드의 정의부로 이동한다. 정의부에서 F12를 누르면 선언부로 이동한다.
26. 보기.뒤로탐색 (Ctrl + - (전역))
이전 작업 위치로 이동한다.
27. 보기.앞으로탐색 (Ctrl + Shift + - (전역))
뒤로탐색한 만큼 다시 앞으로 이동한다.
28. 편집.문서서식 (Ctrl + K, Ctrl + D (전역))
선택된 영역을 줄 맞춰 정리한다.
29. 주석
Ctrl + K, Ctrl + C
주석 설정
Ctrl + K, Ctrl + U
주석 풀기
30. 편집.중괄호로이동 (Ctrl + ] (텍스트 편집기))
중괄호의 끝으로 이동한다. 끝에서는 중괄호의 처음으로 이동한다.
31. 코드 리펙토링 (Ctrl + .)
특정 텍스트를 선택한 후 단축키를 누를 경우 리펙토링 팝업 메뉴를 띄울 수 있다.
이를 통해 C# 프로퍼티를 자동생성할 수 있다.
32. 편집.개요확장축소 (Ctrl + M, Ctrl + M (텍스트 편집기))
현재 커서의 코드를 접을 수 있다.
33. 솔루션 탐색기 포커스 (Ctrl + Alt + L)
솔루션 탐색기가 포커스된다.
34. 솔루션 탐색기에서 현재 문서 선택 (Ctrl + [ + S)
현재 작업중인 문서가 솔루션 탐색기에서 선택된다.
디버깅
중단점 (Break Point)
Visual Studio를 이용한 디버깅 방법에 대해 알아보자.
먼저 중단점(Break Point)에 대해 알아보겠다.
#include <iostream>
using namespace std;
void Function(int value)
{
std::cout << value;
}
int main()
{
int value = 30;
Function(value);
return 0;
}
다음과 같은 함수 예제가 있을 때 int value = 30; 라인에 중단점을 잡아보자.
해당 라인을 클릭하고, F9를 클릭하면 중단점이 생긴다. (F9를 한번 더 누르면 사라진다.)
이후 디버깅 시작 (F5) 명령을 주면 디버그 모드로 프로그램이 실행되면서 중단점 걸려있는 라인에 멈춘다.
이 상태에서는 변수나 메모리, 호출 스택 등의 정보를 볼 수 있고, 그런 정보들을 통해 왜 문제가 발생하였는지 추적할 수 있다.
코드를 조금씩 실행시켜가며 버그를 추적해야 하는 상황도 있을 것이다. 다음과 같은 명령들을 알아두면 좋다.
1. 계속 (F5)
디버그 모드로 실행된 상태에서 F5를 한번 더 누르면 다음 중단점에서 멈출 수 있다.
2. 한 단계씩 코드 실행 (F11)
중단점에 멈춘 상태에서 프로그램을 한 단계씩 실행시켜보고 싶을 수 있을 것이다. 이 명령은 이 상황에 사용되는데 첫 중단점에서부터 한 라인씩 내려가고 함수를 만나면 더 깊게 타고 내려갈 수 있다.
3. 프로시저 나가기 (Shift + F11)
한 단계씩 프로그램을 실행시키다 보면 계속 함수를 타고 내려가게 되고, 중간에 현재 함수로부터 나가서 탐색하고 싶을 수 있다. 이 때 프로시저 나가기 명령을 통해 현재 함수로부터 나간 위치로 이동할 수 있다.
4. 프로시저 단위 실행 (F10)
조금 더 큰 단위로 프로그램을 실행시켜보고 싶을 수 있다. 끝없이 코드를 타고 내려가는 것이 아닌, 현재 컨텍스트에서 한 라인씩 코드를 진행시키고 싶을 수 있을 것이다. 예를 들면 Function()의 body로 내려가지 않고 Function() 이 호출 된 이후 라인으로 바로 넘어가는 것이다. 이런 상황에서 프로시저 단위 실행 명령이 이용된다.
디버깅을 충분히 진행하였으면 디버깅을 끝마쳐야 할 것이다. 이 경우 디버깅 중지(Shift + F5) 명령을 이용하면 된다.
디버깅 이후 모든 중단점을 제거하고싶을 수 있다. 이 경우 모든 중단점 삭제(Ctrl + Shift + F9) 명령을 이용하면 된다.
호출 스택
현재 중단점의 걸린 함수가 어떤 함수들을 통해 호출된것인지 확인하고 싶을 수 있다. 이런 누적된 함수호출 상태를 호출 스택이라 부른다. Visual Studio에서도 호출 스택을 보는 기능이 있다.
디버그 모드로 들어간 후, 디버그 -> 창 -> 호출스택 을 선택하여 디버깅모드에서 현재 함수가 호출된 스택을 볼 수 있다.
메모리
디버깅 모드에서 메모리를 직접 확인해야하는 경우도 생길 수 있다. 디버그 모드로 들어간 후, 디버그 -> 창 -> 메모리 -> 메모리 1 을 선택하여 메모리 창을 띄운다.
다음과 같은 메모리 창을 띄울 수 있다. 확인하고싶은 변수가 있는 경우 메모리 창 주소란에 넣어주면 된다.
value의 메모리를 확인하고 싶으면 &value를 주소란에 넣어준다. 그러면 주소에 해당하는 16진수 값으로 변환되고 해당 주소의 값을 16진수로 볼 수 있다. ex) 0000001e == 30
스레드
현재 어떤 스레드들이 실행되고 있는지 확인하고 싶을 수 있다. 디버그 모드로 들어간 후, 디버그 -> 창 -> 스레드 를 선택하여 현재 스레드들을 확인할 수 있다.
#include <iostream>
#include <thread>
#include <mutex>
int sharedValue = 0;
std::mutex mtx;
void incrementSharedValue()
{
for (int i = 0; i < 100000; ++i)
{
mtx.lock();
sharedValue++;
mtx.unlock();
}
}
int main()
{
std::thread thread1(incrementSharedValue);
std::thread thread2(incrementSharedValue);
thread1.join();
thread2.join();
std::cout << "Shared value : " << sharedValue << std::endl;
return 0;
}
코드를 통해 ID 23652, 26052 스레드들이 생성되었을을 확인할 수 있다. (그 외 스레드들은 기본으로 생성된 스레드이다.)
모듈
현재 어떤 모듈(라이브러리)들이 로드되었는지 확인해야하는 상황도 생길 수 있다.
이 경우, 디버그 모드로 들어간 후 디버그 -> 창 -> 모듈 을 선택한다.
PDB
Visual Studio에서 PDB 로드하는 방법이다.
PDB 파일은 디버깅을 위한 메타정보들을 저장해두는 파일이다. 프로그램에 중단점을 걸고 특정 위치에서의 정보를 보는 디버깅 기능들을 이용하기 위해서는 PDB 파일이 필요하다. 하지만 외부 라이브러리를 이용하는 경우 라이브러리만 포함시키고 PDB를 포함하지 않는 경우가 있다. 이런 상황에서 라이브러리 코드에서 크래시가 발생하면 디버깅을 할 방법이 없다. 그러므로 라이브러리를 따로 디버깅 빌드를 통해 PDB파일과 함께 만들어 주는것이 좋다.
먼저 Visual Studio에서 f5를 통해 디버그 모드로 실행한다.
메뉴 -> 디버그 -> 창 -> 모듈 을 통해 로드된 dll 파일 리스트를 볼 수 있다. 여기에서 각 dll 파일들의 PDB가 로드되었는지 아닌지 확인할 수 있다.
PDB가 없는 dll의 경우에는 디버깅 기능을 이용할 수 없을 것이다. 기본적으로는 dll파일 옆에 PDB 파일을 두면 알아서 매칭되어 로드되는데, 수동으로 로드시켜주는 방법도 있다. 메뉴 -> 도구 -> 옵션 -> 디버깅 -> 기호 위치에서 추가하고자 하는 .pdb 파일을 추가해주면 된다.
PDB가 로드되었더라도 소스코드를 찾지 못한 경우 어느 소스파일의 몇번째 라인에서 크래시가 났는지 트래킹해주지 못할 수 있다. 이 경우 라이브러리를 디버그로 빌드할 때 빌드 옵션을 잘못 주었을 수 있다. 디버그 정보 형식을 프로그램 데이터베이스(/Zi)로 설정했는지 확인하도록 한다. 프로젝트 -> 속성 -> C/C++
Git
1. Visual Studio를 이용하여 git repository를 연동시킬 수 있다. 연동을 통해 Visual Studio에서 git의 여러가지 기능들을 활용할 수 있다.
다음 경로를 통해 연동하고자 하는 레포지토리를 선택할 수 있다.
메뉴 -> Git -> 로컬 리포지토리 -> <my repository>
2. Merge Tool을 다음과 같이 세팅할 수 있다.
메뉴 -> Git -> 설정 -> 소스 제어 -> Git 전역 설정 -> 도구 -> Diff도구, 병합 도구
3. Git 수정되지않은항목과 비교 command를 이용하여 수정된 파일의 현재와 수정 전 상태를 비교하여 보여줄 수 있다. (커맨드는 단축키를 참고)
4. Git 변경 내용을 볼 수 있다. 솔루션 탐색기에서 "Git 변경 내용" 탭으로 이동한다.
시행착오
1. Visual Studio에서 C#을 이용하는 경우 .net 8.0을 지원하지 않는다는 에러 문구가 사라지지 않는 버그가 있었다. 이 문제는 Visual Studio의 버전이 17.8 이상이어야 해결되는 것으로 밝혀졌다. 하지만 사용중인 PC에 다른 버전의 visual studio 가 계속 실행되고 있어서 이 문제를 해결하는데 어려움이 있었다.
'Tool' 카테고리의 다른 글
[Tool] Git 기본 예제 (0) | 2020.11.26 |
---|