GDB를 사용할 때 CLI만으로는 현재 실행 중인 소스 코드의 위치를 파악하기 어려울 때가 있다.
이때 TUI(Text User Interface) 모드를 사용하면 터미널 화면을 분할하여 소스 코드, 어셈블리, 레지스터 상태를 실시간으로 확인하며 디버깅할 수 있다.
1. GDB TUI 개요 및 주요 기능
TUI(Text User Interface) 모드란?
GDB의 기본 텍스트 모드를 확장하여, 터미널 화면을 여러 개의 창으로 나누어 보여주는 기능이다.
별도의 GUI 프로그램 없이도 시각적인 디버깅 환경을 제공한다.
- 화면 분할: 소스 코드(Source), 어셈블리(Assembly), 레지스터(Register), 명령창(Command)을 동시에 확인 가능.
- 실시간 하이라이트: 현재 실행 중인 라인을 소스 코드 상에서 직접 표시.
- 상태 업데이트: 프로그램이 실행됨에 따라 변수 값이나 레지스터 변화를 즉각 반영.
2. GDB TUI 실행 옵션 및 명령어
1) 실행 옵션
gdb -tui [program]: GDB를 시작할 때부터 TUI 모드로 진입한다.
- gdb -q -tui [program]: -q (quiet) 옵션을 추가하여 GDB 시작 시 출력되는 버전 및 저작권 메시지(Banner)를 생략한다.
2) 화면 관리 및 유틸리티
- 화면 깨짐 해결 (Refresh): printf 등으로 출력된 값 때문에 TUI 화면이 깨질 경우 사용한다. (단, refresh 하면 printf로 화면에 출력된 값이 지워지기 때문에 변수의 값을 화면에 계속 띄워놓고 추적하려면 display [변수] 명령어를 사용하는 것을 추천)
- 명령어: refresh
- 단축키: Ctrl + L
- TUI 모드 전환: GDB 실행 도중 모드를 켜거나 끌 수 있다.
- tui enable (tu e) : TUI 모드 활성화.
- tui disable (tu d) : TUI 모드 비활성화 (기본 CLI 모드로 복귀).
- help tui: TUI 관련 도움말 확인.
3) TUI 레이아웃(Layout) 제어
TUI 모드는 화면을 분할해서 사용할 수 있는 것이 최대 장점이다.
layout 명령어를 통해 원하는 정보를 선택해서 볼 수 있다.
| 명령어 | 약어 | 설명 |
| help layout | - | 레이아웃 관련 도움말 출력 |
| layout src | la sr | 소스 코드 창을 화면에 표시 |
| layout asm | la as | 어셈블리 코드 창을 화면에 표시 |
| layout regs (reg) | la re | 레지스터 창을 추가 (보통 소스/어셈블리와 함께 표시) |
| layout split | la sp | 소스와 어셈블리 창을 동시에 표시 |

4) 윈도우 포커스(Focus) 이동
TUI 모드에서 방향키를 누르면 기본적으로 소스 창이 스크롤된다.
이전 명령어를 찾기 위해 명령창을 스크롤하고 싶다면 포커스(Focus)를 변경해야 한다.
- help focus: 포커스 관련 도움말 출력
- 창 지정 이동:
- focus src: 소스 창으로 포커스 이동
- focus asm: 어셈블리 창으로 포커스 이동
- focus regs: 레지스터 창으로 포커스 이동
- focus cmd: 명령창(Command)으로 포커스 이동

- 순차 이동:
- focus next / fs n: 다음 창으로 포커스 이동
- focus prev / fs p: 이전 창으로 포커스 이동
5) 창 크기 조절 (winheight)
특정 창(src/asm/reg/cmd)의 내용을 더 많이 보고 싶을 때 크기를 동적으로 조절할 수 있다.
- 절대 크기 지정: winheight [창이름] [라인수]
- 예: winheight src 20 (소스 창을 20라인 크기로 설정)
- 상대 크기 조절:
- winheight [창이름] +[n]: 창 크기를 n라인만큼 늘림
- winheight [창이름] -[n]: 창 크기를 n라인만큼 줄임

'Journey to Security > C언어' 카테고리의 다른 글
| C 언어 배열의 문자열 수정과 strcpy의 동작 원리 (+strncpy) (0) | 2026.02.24 |
|---|---|
| C언어 조건부 컴파일: #ifdef (0) | 2026.02.24 |
| C 포인터 배열과 이중 포인터의 메모리 구조 (0) | 2026.02.23 |
| C언어 배열명과 포인터의 차이: GDB로 문자열 저장 방식 뜯어보기 (0) | 2026.02.22 |
| C언어 배열 메모리 레이아웃 (feat. GDB) (0) | 2026.02.20 |