Skip to content

Commit 7e47715

Browse files
authored
Update README.md
1 parent d79a8cb commit 7e47715

1 file changed

Lines changed: 47 additions & 50 deletions

File tree

README.md

Lines changed: 47 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,73 @@
1+
12

23
# 🚀 vscode-airgapped-cpp-debug
34

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+
516

617
## 🌟 주요 특징
7-
* **Zero-Agent**: 서버에 `curl`, `wget`을 통한 추가 바이너리 설치가 필요 없습니다.
8-
* **Air-gapped Ready**: 오직 SSH(22번 포트)와 SFTP만 사용하여 작동합니다.
18+
* **Zero-Agent**: 서버에 별도의 에이전트나 바이너리를 다운로드/설치할 필요가 없습니다.
19+
* **No curl/wget**: 외부망 접속이 차단된 환경에서도 SSH(22번 포트)만 열려 있다면 작동합니다.
920
* **Complex Structure**: 실행 파일(`a.out`)과 다중 공유 라이브러리(`.so`) 간의 의존성 디버깅을 지원합니다.
10-
* **Step-Into Support**: 메인 로직에서 라이브러리 내부 함수로 진입하는 디버깅이 가능합니다.
11-
12-
---
21+
* **Step-Into Support**: 메인 로직에서 라이브러리 내부 함수(`libb.so`, `libd.so`)로 진입하는 디버깅이 가능합니다.
1322

1423
## 📂 프로젝트 구조
1524
```text
1625
.
1726
├── .vscode/
18-
│ └── launch.json # 윈도우 VS Code용 원격 디버그 설정 (핵심)
27+
│ └── launch.json # 윈도우 VS Code용 원격 디버그 설정
1928
├── apps/
2029
│ └── main_app/ # 메인 실행 프로그램 (a.out)
2130
├── 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) 저장소 (서버에서 생성)
2635
```
2736

28-
---
29-
30-
## 🛠 사전 준비 사항 (Prerequisites)
31-
32-
### 1. 리눅스 서버 (Remote)
33-
* **GDB**: `gdb`가 설치되어 있어야 합니다. (`gdb --version`으로 확인)
34-
* **SSH**: SSH 서비스가 활성화되어 있어야 합니다.
37+
## 🛠️ 사전 준비 사항 (Prerequisites)
3538

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를 서버에 등록(권장).
4043

41-
---
44+
### 2. 리눅스 서버 (Remote)
45+
* **GDB**: 표준 `gdb` 설치 필수. (`gdb --version`으로 확인)
46+
* **Build Tools**: `gcc`, `make` 등 컴파일 도구.
47+
* **주의**: **서버에는 VS Code를 설치할 필요가 없습니다.**
4248

4349
## 🚀 빠른 시작 가이드 (Quick Start)
4450

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` 설정이 정확해야 실행 시 라이브러리 로드 에러가 발생하지 않습니다.
6766

6867
---
6968

70-
## ⚠️ 주의사항
71-
* **소스 동기화**: 서버의 소스와 윈도우의 소스가 라인 단위로 일치해야 브레이크포인트가 정확히 작동합니다.
72-
* **빌드 옵션**: 모든 Makefile에는 `-g` (디버그 심볼) 옵션이 포함되어 있어야 합니다.
73-
* **LD_LIBRARY_PATH**: 실행 시 라이브러리를 찾지 못한다면 `launch.json``environment` 설정을 확인하세요.
69+
### 💡 에어갭 환경 팁
70+
서버에 `gdb`가 설치되어 있지 않다면, 인터넷이 가능한 환경에서 해당 OS 배포판용 `.rpm` 또는 `.deb` 패키지를 다운로드하여 SFTP로 옮긴 후 수동 설치(`rpm -ivh` 또는 `dpkg -i`) 하십시오.
7471

75-
---
7672

73+

0 commit comments

Comments
 (0)