|
| 1 | + |
1 | 2 |
|
2 | 3 | # 🚀 vscode-airgapped-cpp-debug |
3 | 4 |
|
4 | | -본 프로젝트는 인터넷 연결이 불가능한 **에어갭(Air-gapped) 리눅스 환경**에서 별도의 에이전트(`vscode-server`)나 `gdbserver` 설치 없이, 오직 **SSH 파이프**만을 이용하여 윈도우 VS Code에서 원격 디버깅을 수행할 수 있도록 설계된 C/C++ 프로젝트 템플릿입니다. |
| 5 | +인터넷이 차단된 **에어갭(Air-gapped) 환경**에서 윈도우의 VS Code를 사용하여 리눅스 서버의 C/C++ 프로젝트를 원격 디버깅하기 위한 템플릿입니다. |
| 6 | + |
| 7 | +## 🏗️ 시스템 아키텍처 (Architecture) |
| 8 | + |
| 9 | +이 프로젝트는 서버에 `vscode-server` 에이전트를 설치할 수 없는 환경을 위해 **SSH Pipe Transport** 방식을 사용합니다. |
| 10 | + |
| 11 | +* **Windows (Local):** VS Code UI, C/C++ 확장, `ssh.exe`가 설치된 개발 환경입니다. |
| 12 | +* **Linux (Remote):** VS Code가 설치되지 않으며, 오직 표준 `gdb`와 빌드된 바이너리만 존재합니다. |
| 13 | +* **Bridge:** 윈도우의 `ssh.exe`가 파이프 역할을 하여 로컬 UI와 원격 GDB 사이의 명령을 중계합니다. |
| 14 | + |
| 15 | + |
5 | 16 |
|
6 | 17 | ## 🌟 주요 특징 |
7 | | -* **Zero-Agent**: 서버에 `curl`, `wget`을 통한 추가 바이너리 설치가 필요 없습니다. |
8 | | -* **Air-gapped Ready**: 오직 SSH(22번 포트)와 SFTP만 사용하여 작동합니다. |
| 18 | +* **Zero-Agent**: 서버에 별도의 에이전트나 바이너리를 다운로드/설치할 필요가 없습니다. |
| 19 | +* **No curl/wget**: 외부망 접속이 차단된 환경에서도 SSH(22번 포트)만 열려 있다면 작동합니다. |
9 | 20 | * **Complex Structure**: 실행 파일(`a.out`)과 다중 공유 라이브러리(`.so`) 간의 의존성 디버깅을 지원합니다. |
10 | | -* **Step-Into Support**: 메인 로직에서 라이브러리 내부 함수로 진입하는 디버깅이 가능합니다. |
11 | | - |
12 | | ---- |
| 21 | +* **Step-Into Support**: 메인 로직에서 라이브러리 내부 함수(`libb.so`, `libd.so`)로 진입하는 디버깅이 가능합니다. |
13 | 22 |
|
14 | 23 | ## 📂 프로젝트 구조 |
15 | 24 | ```text |
16 | 25 | . |
17 | 26 | ├── .vscode/ |
18 | | -│ └── launch.json # 윈도우 VS Code용 원격 디버그 설정 (핵심) |
| 27 | +│ └── launch.json # 윈도우 VS Code용 원격 디버그 설정 |
19 | 28 | ├── apps/ |
20 | 29 | │ └── main_app/ # 메인 실행 프로그램 (a.out) |
21 | 30 | ├── libs/ |
22 | | -│ ├── lib_b/ # 중간 공유 라이브러리 (libb.so) |
23 | | -│ └── lib_d/ # 최하위 공유 라이브러리 (libd.so) |
24 | | -├── Makefile # 프로젝트 전체 빌드 관리 |
25 | | -└── build/ # 빌드 결과물 저장소 (서버 생성) |
| 31 | +│ ├── lib_b/ # 공유 라이브러리 B (libb.so) |
| 32 | +│ └── lib_d/ # 공유 라이브러리 D (libd.so) |
| 33 | +├── Makefile # 프로젝트 전체 통합 빌드 (Root Makefile) |
| 34 | +└── build/ # 빌드 결과물 (.so, a.out) 저장소 (서버에서 생성) |
26 | 35 | ``` |
27 | 36 |
|
28 | | ---- |
29 | | - |
30 | | -## 🛠 사전 준비 사항 (Prerequisites) |
31 | | - |
32 | | -### 1. 리눅스 서버 (Remote) |
33 | | -* **GDB**: `gdb`가 설치되어 있어야 합니다. (`gdb --version`으로 확인) |
34 | | -* **SSH**: SSH 서비스가 활성화되어 있어야 합니다. |
| 37 | +## 🛠️ 사전 준비 사항 (Prerequisites) |
35 | 38 |
|
36 | | -### 2. 윈도우 개발 환경 (Local) |
37 | | -* **VS Code**: `C/C++` 확장(Microsoft)이 설치되어 있어야 합니다. |
38 | | -* **SSH Client**: 윈도우 기본 `ssh.exe`를 사용합니다. |
39 | | -* **SSH Key**: 비밀번호 입력 없이 접속 가능하도록 `ssh-copy-id` 등으로 키 등록을 권장합니다. |
| 39 | +### 1. 윈도우 개발 환경 (Local) |
| 40 | +* **VS Code**: [C/C++ 확장(Microsoft)](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) 설치 필수. |
| 41 | +* **OpenSSH**: 윈도우 기본 기능을 통해 `ssh.exe` 사용 가능 확인. |
| 42 | +* **SSH Key**: 비밀번호 입력 없이 접속 가능하도록 SSH Key를 서버에 등록(권장). |
40 | 43 |
|
41 | | ---- |
| 44 | +### 2. 리눅스 서버 (Remote) |
| 45 | +* **GDB**: 표준 `gdb` 설치 필수. (`gdb --version`으로 확인) |
| 46 | +* **Build Tools**: `gcc`, `make` 등 컴파일 도구. |
| 47 | +* **주의**: **서버에는 VS Code를 설치할 필요가 없습니다.** |
42 | 48 |
|
43 | 49 | ## 🚀 빠른 시작 가이드 (Quick Start) |
44 | 50 |
|
45 | | -### Step 1: 소스 코드 동기화 |
46 | | -WinSCP 또는 SFTP 도구를 사용하여 본 프로젝트 전체를 서버의 특정 경로(예: `/home/user/dev`)에 업로드합니다. |
47 | | -> **Tip:** WinSCP의 "업데이트된 상태로 유지" 기능을 사용하면 로컬 수정 사항이 실시간으로 서버에 반영됩니다. |
48 | | -
|
49 | | -### Step 2: 서버에서 빌드 |
50 | | -서버 터미널에 접속하여 루트 디렉토리에서 빌드를 수행합니다. |
51 | | -```bash |
52 | | -make clean |
53 | | -make |
54 | | -``` |
55 | | -`build/` 폴더 내에 `a.out`, `libb.so`, `libd.so`가 생성되었는지 확인합니다. |
56 | | - |
57 | | -### Step 3: `launch.json` 수정 |
58 | | -`.vscode/launch.json` 파일을 열어 다음 항목을 자신의 환경에 맞게 수정합니다. |
59 | | -* `"pipeArgs"`: 서버 접속 주소 (`user@ip`) |
60 | | -* `"program"`: 서버 내 `a.out` 절대 경로 |
61 | | -* `"sourceFileMap"`: 서버 경로와 윈도우 로컬 경로 매칭 |
62 | | - |
63 | | -### Step 4: 디버깅 시작 |
64 | | -1. `main.c` 또는 라이브러리 소스에 브레이크포인트를 잡습니다. |
65 | | -2. `F5`를 눌러 디버깅을 시작합니다. |
66 | | -3. 변수 조사, 조사식, 콜 스택 등 모든 VS Code 디버깅 기능을 활용합니다. |
| 51 | +1. **소스 동기화**: SFTP(WinSCP 등)를 사용하여 프로젝트 전체를 서버의 `/home/user/dev` 경로에 복사합니다. |
| 52 | +2. **서버 빌드**: SSH 터미널에서 루트 디렉토리의 `make`를 실행하여 `build/` 폴더에 바이너리를 생성합니다. |
| 53 | + ```bash |
| 54 | + make |
| 55 | + ``` |
| 56 | +3. **환경 설정**: `.vscode/launch.json`에서 아래 항목을 수정합니다. |
| 57 | + * `pipeArgs`: 서버 접속 계정 및 IP (`user@192.168.x.x`) |
| 58 | + * `program`: 서버 내 실행 파일의 **절대 경로** |
| 59 | + * `sourceFileMap`: 서버 경로와 윈도우 로컬 경로 1:1 매칭 |
| 60 | +4. **디버깅**: `F5`를 눌러 디버깅을 시작합니다. 라이브러리(`.so`) 내부 함수까지 **Step-Into (F11)**가 가능합니다. |
| 61 | + |
| 62 | +## ⚠️ 핵심 체크리스트 |
| 63 | +* **소스 동기화**: 윈도우와 리눅스의 소스 코드가 라인 단위로 일치해야 브레이크포인트가 정확히 작동합니다. (WinSCP의 '자동 업데이트' 기능 권장) |
| 64 | +* **디버그 심볼**: 모든 `Makefile` 빌드 시 `-g` 옵션이 포함되어야 합니다. |
| 65 | +* **라이브러리 경로**: `launch.json`의 `LD_LIBRARY_PATH` 설정이 정확해야 실행 시 라이브러리 로드 에러가 발생하지 않습니다. |
67 | 66 |
|
68 | 67 | --- |
69 | 68 |
|
70 | | -## ⚠️ 주의사항 |
71 | | -* **소스 동기화**: 서버의 소스와 윈도우의 소스가 라인 단위로 일치해야 브레이크포인트가 정확히 작동합니다. |
72 | | -* **빌드 옵션**: 모든 Makefile에는 `-g` (디버그 심볼) 옵션이 포함되어 있어야 합니다. |
73 | | -* **LD_LIBRARY_PATH**: 실행 시 라이브러리를 찾지 못한다면 `launch.json`의 `environment` 설정을 확인하세요. |
| 69 | +### 💡 에어갭 환경 팁 |
| 70 | +서버에 `gdb`가 설치되어 있지 않다면, 인터넷이 가능한 환경에서 해당 OS 배포판용 `.rpm` 또는 `.deb` 패키지를 다운로드하여 SFTP로 옮긴 후 수동 설치(`rpm -ivh` 또는 `dpkg -i`) 하십시오. |
74 | 71 |
|
75 | | ---- |
76 | 72 |
|
| 73 | + |
0 commit comments