2021년 9월 22일 수요일

우분투 리눅스 기반 프로그램 디버거 소개 및 사용법

이 글은 우분투 리눅스 기반 프로그램 디버거 소개 및 사용법을 공유한다. 개발하던 프로그램이 제대로 동작하지 않으면, 디버깅이 필요하다. 여기서는 리눅스에서 가장 많이 사용되는 디버거인 GDB, KDbg, Eclipse를 소개하고, 사용방법을 간단히 공유한다.

디버그란
디버그는 컴퓨터로 실행되는 프로그램에 오류가 있을 경우, 이 오류를 해결하는 방법 및 행위를 말한다. 최초의 컴퓨터 버그는 1947년 실제 컴퓨터 부품 내에 들어가 오동작을 일으킨 벌래였다.
최초의 컴퓨터 버그(1947)

디버그를 위해서는 다음과 같은 기본적인 기능이 필요하다. 여기서, 브레이크포인트(break point)는 디버깅 실행 중 멈추는 지점을 의미한다. 모든 디버거는 이와 같은 기본 기능을 지원한다.
  • 브레이크포인트 설정
  • 브레이크포인트까지 계속 실행
  • 명령행 한단계 실행
  • 함수 진입
  • 함수 빠져나오기
  • 현재 변수값 확인
GDB는 GNU 소프트웨어 기본 디버거이다. GDB는 유닉스 기반에서 개발되어, 리눅스에도 이식되어 있다. 설치를 위해 우분투 터미널에서 다음 명령을 입력한다.
sudo apt-get install gdb

설치 후, 실행파일이 있는 폴더에서 다음과 같이 명령을 입력한다.
gdb --args [프로그램명] [입력인자1] [입력인자2...]

그럼 다음과 같이 디버그가 실행된다. 이제, gdb 명령어를 이용해 디버깅을 하면 된다.

gdb 명령창이 실행되면, b main 명령으로 main 엔트리에 브레이크포인트를 설정한다. r 명령을 입력하면, 브레이크포인트까지 실행될 것이다. p argc 명령으로 argc 변수값을 확인해 본다. 이런식으로 디버깅을 할 수 있다.

이외, 주요 명령어는 다음과 같다. 
b main - Puts a breakpoint at the beginning of the program
b - Puts a breakpoint at the current line
b N - Puts a breakpoint at line N
b +N - Puts a breakpoint N lines down from the current line
b fn - Puts a breakpoint at the beginning of function "fn"
d N - Deletes breakpoint number N
info break - list breakpoints
r - Runs the program until a breakpoint or error
c - Continues running the program until the next breakpoint or error
f - Runs until the current function is finished. step out
s - Runs the next line of the program. step in
s N - Runs the next N lines of the program
n - Like s, but it does not step into functions. next
u N - Runs until you get N lines in front of the current line
p var - Prints the current value of the variable "var"
bt - Prints a stack trace
u - Goes up a level in the stack
d - Goes down a level in the stack
q - Quits gdb

KDBG는 GNU 소프트웨어 디버그용 무료 오픈소스 프로그램이다. KDE 아키텍처를 이용해 GUI(Graphic User Interface)를 지원한다.

사용을 위해서는 우분투 터미널에서 다음 명령을 입력한다. 소스를 다운로드 받고, 빌드 및 설치한다. 
sudo apt install extra-cmake-modules
git clone -b maint https://github.com/j6t/kdbg.git 
cd kdbg/
git tag -l
git checkout kdbg-3.0.1
cmake .
sudo make install

만약, CMake에서 에러가 발생하면, 해당 패키지를 apt-get 으로 설치한 후, 다시 시도하여 빌드한다. 빌드에 성공하면 다음과 같이 관련 모듈이 설치된다.

kdbg를 명령창에 입력하면, 다음과 같이 GUI가 표시된다. 소스와 실행파일 위치를 메뉴를 통해 선택하고 Run을 하면 디버깅을 할 수 있다. 브레이크 포인트는 편집창 왼쪽 줄 옆에 클릭하면된다. 변수는 Expression 창에서 그 값을 확인할 수 있다.

이클립스는 IBM의 웹스피어 스튜디오란 개발자 지원 도구에서 파생된 것으로, 엔진부분이 오픈소스로 공개된을 사용해 개발된 것이다. 현재는 이클립스 재단에서 통합 관리한다.


사용을 위해, 여기에서 프로그램을 다운받아 설치한다.
설치 후, 이클립스를 실행하고, 간단한 C++ 어플리케이션 프로젝트를 생성한다. 이름은 hello로 한다. 사용방법은 Visual Studio와 유사하게, 메뉴나 프로젝트 탐색창에서 Build, Run, Debug를 실행할 수 있도록 되어 있다.

디버깅을 위해, 프로젝트 탐색기의 프로젝트를 선택하고, cpp파일을 만든다. 해당 소스 파일 내에 hello world 출력 코드를 코딩하고, 빌드한다. 

#include <stdio.h>

int main()
{
char* szHello = "hello world! from stjohns";
printf(szHello);
return 0;
}

빌드가 성공하면, 실행 및 디버깅 환경 설정을 다음과 같이 실행한다. 

소스 편집기 창의 라인번호 왼쪽을 더블클릭해, 브레이크포인트를 만든 후 디버깅을 실행하면 다음과 같이 해당 지점에 실행이 멈추고, 변수값 등을 확인할 수 있다.
 
기존 프로젝트를 가져와서 디버깅을 하고 싶으면, File > import > C/C++ > Existing Code as Makefile Project 를 선택하고, 프로젝트의 Makefile이 있는 루트 폴더를 선택하면 된다. 그럼, 다음과 같이 프로젝트에서 생성된 실행파일을 디버깅할 수 있다. 아울러, 디버그 심벌이 있으면, 소스코드는 함께 표시된다. 참고로, 디버그 심벌이 제대로 연결되지 않으면, 해당 부분의 소스 라인은 디버그할 수 없다. 

pdb
python디버거이다. 소스코드를 디버깅할 수 있으며, 앞서 언급한 gdb와 유사한 명령어를 지원한다.
명령은 다음과 같다.
python -m pdb example.py

PDB를 사용하여 디버깅 모드로 진입 후, 다음 명령어를 사용해 디버깅하면 된다.
help: 도움말
next: 다음 문장 이동
print: 변수값 화면 표시
list: 소스코드 리스트 출력. 현재 위치 화살표 표시
where: 콜스택 출력
continue: 계속 실행. 다음 중단점에 멈추거나 중단점 없으면 끝까지 실행
step: Step Into. 함수 내부 진입
return: 현재 함수의 리턴 직전까지 실행
!변수명 = 값: 변수에 값 재설정

pdb 사용 예시

printf
오래전에 아는 선배가 제일 좋은 디버깅 도구로 추천한 것이 printf였다. 앞의 디버깅도구들은 심벌을 로딩하지 못하는 환경에서는 디버깅이 어렵다. 이 경우, 에러가 있을만한 코드를 printf로 표시해 나가면서 디버깅하면 된다.
printf은 가장 단순하면서도, 가장 확실하게 디버깅할 수 있는 도구이다.

참고

댓글 없음:

댓글 쓰기