|
4 | 4 |
|
5 | 5 | 인터넷이 차단된 **에어갭(Air-gapped) 환경**에서 윈도우의 VS Code를 사용하여 리눅스 서버의 C/C++ 프로젝트를 원격 디버깅하기 위한 템플릿입니다. |
6 | 6 |
|
7 | | -## 🏗️ 시스템 아키텍처 (Architecture) |
| 7 | +## 🏗️ 설치 및 작동 구조 (Installation & Architecture) |
8 | 8 |
|
9 | | -이 프로젝트는 서버에 `vscode-server` 에이전트를 설치할 수 없는 환경을 위해 **SSH Pipe Transport** 방식을 사용합니다. |
| 9 | +이 프로젝트의 핵심은 **"지능(UI)은 윈도우에, 실행(Runtime)은 리눅스에"** 두는 것입니다. 서버에 무거운 에이전트를 설치할 수 없는 환경을 위해 설계되었습니다. |
10 | 10 |
|
11 | | -* **Windows (Local):** VS Code UI, C/C++ 확장, `ssh.exe`가 설치된 개발 환경입니다. |
12 | | -* **Linux (Remote):** VS Code가 설치되지 않으며, 오직 표준 `gdb`와 빌드된 바이너리만 존재합니다. |
13 | | -* **Bridge:** 윈도우의 `ssh.exe`가 파이프 역할을 하여 로컬 UI와 원격 GDB 사이의 명령을 중계합니다. |
| 11 | +### 1. 윈도우 로컬 (Local PC) - **VS Code 설치 위치** |
| 12 | +* **VS Code 본체**: 오직 **윈도우에만 설치**됩니다. |
| 13 | +* **확장 프로그램**: `C/C++ Extension` 등 모든 도구는 윈도우 VS Code 내에 설치됩니다. |
| 14 | +* **SSH 클라이언트**: 리눅스 서버와 통신하기 위한 `ssh.exe`가 위치합니다. |
| 15 | +* **역할**: 코드 편집, 디버깅 컨트롤(F5, F10 등), 변수 모니터링 UI 제공. |
14 | 16 |
|
| 17 | +### 2. 리눅스 서버 (Remote Server) - **VS Code 미설치** |
| 18 | +* **VS Code 미설치**: 서버에는 VS Code나 `vscode-server` 에이전트를 **설치할 필요가 없으며 설치하지 않습니다.** |
| 19 | +* **표준 GDB**: 리눅스 기본 패키지인 `gdb`만 사용합니다. |
| 20 | +* **역할**: 실제 코드의 빌드(Compile) 및 프로세스 실행, GDB를 통한 디버그 정보 송신. |
15 | 21 |
|
16 | 22 |
|
17 | | -## 🌟 주요 특징 |
18 | | -* **Zero-Agent**: 서버에 별도의 에이전트나 바이너리를 다운로드/설치할 필요가 없습니다. |
19 | | -* **No curl/wget**: 외부망 접속이 차단된 환경에서도 SSH(22번 포트)만 열려 있다면 작동합니다. |
20 | | -* **Complex Structure**: 실행 파일(`a.out`)과 다중 공유 라이브러리(`.so`) 간의 의존성 디버깅을 지원합니다. |
21 | | -* **Step-Into Support**: 메인 로직에서 라이브러리 내부 함수(`libb.so`, `libd.so`)로 진입하는 디버깅이 가능합니다. |
22 | 23 |
|
23 | | -## 📂 프로젝트 구조 |
| 24 | +--- |
| 25 | + |
| 26 | +## 📂 소스 코드 위치 및 관리 (Source Code Location) |
| 27 | + |
| 28 | +디버깅 시 소스 코드 라인을 정확히 매핑하기 위해 **윈도우와 리눅스 양쪽에 동일한 구조**의 소스 코드가 존재해야 합니다. |
| 29 | + |
| 30 | +* **윈도우 소스**: VS Code가 화면에 코드를 보여주고 브레이크포인트를 설정하는 용도입니다. |
| 31 | +* **리눅스 소스**: 실제 서버에서 컴파일되어 바이너리(a.out)를 생성하는 용도입니다. |
| 32 | +* **동기화**: WinSCP 등을 이용해 윈도우에서 수정한 내용을 리눅스로 실시간 전송(Push)해야 합니다. |
| 33 | + |
24 | 34 | ```text |
25 | | -. |
| 35 | +<Project Root>/ # (Windows: C:\Work\Project, Linux: /home/user/dev) |
26 | 36 | ├── .vscode/ |
27 | | -│ └── launch.json # 윈도우 VS Code용 원격 디버그 설정 |
| 37 | +│ └── launch.json # 윈도우 VS Code용 설정 (서버 접속 정보 포함) |
28 | 38 | ├── apps/ |
29 | | -│ └── main_app/ # 메인 실행 프로그램 (a.out) |
30 | | -├── libs/ |
31 | | -│ ├── lib_b/ # 공유 라이브러리 B (libb.so) |
32 | | -│ └── lib_d/ # 공유 라이브러리 D (libd.so) |
33 | | -├── Makefile # 프로젝트 전체 통합 빌드 (Root Makefile) |
34 | | -└── build/ # 빌드 결과물 (.so, a.out) 저장소 (서버에서 생성) |
| 39 | +│ └── main_app/ # [소스 코드] |
| 40 | +│ ├── src/main.c # (Windows & Linux 양쪽 동일 위치 필수) |
| 41 | +│ └── Makefile |
| 42 | +├── libs/ # [공유 라이브러리 소스 코드] |
| 43 | +│ ├── lib_b/ |
| 44 | +│ └── lib_d/ |
| 45 | +├── Makefile # 전체 통합 빌드용 |
| 46 | +└── build/ # [결과물] 리눅스 빌드 시 생성되는 .so 및 a.out |
35 | 47 | ``` |
36 | 48 |
|
37 | | -## 🛠️ 사전 준비 사항 (Prerequisites) |
38 | | - |
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를 서버에 등록(권장). |
43 | | - |
44 | | -### 2. 리눅스 서버 (Remote) |
45 | | -* **GDB**: 표준 `gdb` 설치 필수. (`gdb --version`으로 확인) |
46 | | -* **Build Tools**: `gcc`, `make` 등 컴파일 도구. |
47 | | -* **주의**: **서버에는 VS Code를 설치할 필요가 없습니다.** |
| 49 | +--- |
48 | 50 |
|
49 | 51 | ## 🚀 빠른 시작 가이드 (Quick Start) |
50 | 52 |
|
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` 설정이 정확해야 실행 시 라이브러리 로드 에러가 발생하지 않습니다. |
| 53 | +1. **윈도우**: VS Code와 C/C++ 확장을 설치합니다. |
| 54 | +2. **리눅스**: `gdb`, `gcc`, `make`가 설치되어 있는지 확인합니다. (**VS Code 설치 금지**) |
| 55 | +3. **동기화**: 윈도우의 소스 폴더를 리눅스의 작업 디렉토리로 SFTP 복사합니다. |
| 56 | +4. **빌드**: 리눅스 터미널에서 `make`를 실행합니다. |
| 57 | +5. **연결**: 윈도우 VS Code의 `launch.json`에서 서버 IP와 경로를 수정 후 `F5`를 누릅니다. |
66 | 58 |
|
67 | 59 | --- |
68 | 60 |
|
69 | | -### 💡 에어갭 환경 팁 |
70 | | -서버에 `gdb`가 설치되어 있지 않다면, 인터넷이 가능한 환경에서 해당 OS 배포판용 `.rpm` 또는 `.deb` 패키지를 다운로드하여 SFTP로 옮긴 후 수동 설치(`rpm -ivh` 또는 `dpkg -i`) 하십시오. |
71 | | - |
| 61 | +### 💡 왜 서버에 VS Code를 설치하지 않나요? |
| 62 | +일반적인 VS Code Remote 방식은 서버에 `vscode-server`를 자동으로 다운로드하려고 시도하지만, **에어갭 환경에서는 외부망(인터넷) 접속이 차단**되어 이 과정이 실패합니다. 따라서 본 템플릿은 서버에 아무것도 설치하지 않는 **Zero-Agent** 방식을 채택하여 보안 정책을 준수하면서도 강력한 디버깅 기능을 제공합니다. |
72 | 63 |
|
73 | 64 |
|
0 commit comments