Love Every Moment

〔Debug〕에러가 어디서 났는지 모르겠다면 lldb 로 디버깅 해보자 본문

MOMENT:: RECORD/42 SEOUL

〔Debug〕에러가 어디서 났는지 모르겠다면 lldb 로 디버깅 해보자

해 송 2022. 1. 31. 15:32
반응형

LLDB 는 맥 OS 에 기본적으로 설치되어 있는 디버깅 툴이다.

Segmentation fault 나 Memory leak 등등 오류가 발생했는데 어디서 생긴건지 모르겠을 때에 매우 유용하다.

원하는 위치에 브레이크 포인트를 설정해 차례대로 살펴보면서 정확히 어디서 문제가 발생했는지 파악 가능하다.

LLDB 를 사용하는 방법은 다음과 같다.

 


 

1. 컴파일

gcc -g main.c utils.c

컴파일 시에 -g 옵션을 주어야 lldb 를 실행할 수 있게 된다.

만약 Makefile 을 사용한다면 -Wall -Werror -Wextra 와 같은 플래그와 함께 -g 옵션을 추가해주면 된다.

 


 

2. lldb 실행

lldb a.out

lldb 뒤에 디버깅할 실행 파일명을 적는다.

만약 실행 파일이 다른 인자들과 함께 실행되어야 하는 것이면 lldb a.out arg1 와 같이 실행하면 된다.

 


 

3. 브레이크 포인트 설정

(lldb) b func
(lldb) b main.c:20

b 뒤에 브레이크 포인트로 설정할 함수명 또는 파일 명:줄 을 입력한다.

브레이크 포인트는 프로그램 실행 시에 어떤 위치에서 멈출지 정하는 역할을 한다.

만약 브레이크 포인트 없이 바로 lldb 를 실행하면 중간에 멈추지 않고 프로그램이 종료될 때까지 실행되어 버린다.

 


 

4. 실행하기

(lldb) r
(lldb) run

r 또는 run 명령어를 입력하면 브레이크 포인트까지 실행된다.

 


 

5. 검사하기

(lldb) n
(lldb) next
(lldb) s
(lldb) step

이제 한 줄씩 코드를 검사하면서 문제의 원인을 찾을 차례이다.

n(=next) 명령어와 s(=step) 명령어는 모두 코드를 한 줄씩 실행해준다.

다만 차이점으로 n 명령어는 step over, 즉 함수가 있다면 함수 안으로 들어가지 않고 건너 뛴다.

하지만 s 명령어는 step in, 즉 함수가 있다면 함수 안으로 들어가 한 줄씩 실행한다.

 


 

6. 건너뛰기

(lldb) continue
(lldb) finish

반복문처럼 한 줄 한 줄 실행하기에는 오랜 시간이 걸리는 경우, 위의 명령어로 빠져나올 수 있다.

continue 는 다음 브레이크 포인트까지 lldb 를 실행해준다.

finish 는 함수를 빠져나오기 위해 사용된다.

 


 

7. 변수값 확인하기

(lldb) p number
(lldb) print number

p 또는 print 명령어와 함께 변수의 이름을 입력하면 해당 변수의 값을 출력해준다.

 

(lldb) p ptr
(lldb) p *ptr
(lldb) p ptr->next

위와 같이 포인터 연산이나 구조체 포인터 연산 역시 가능하다.

 


 

위의 과정을 거쳐 오류가 발생한 위치에 도달한 경우, stop reason 에서 오류의 원인을 확인할 수 있다.

이 밖에도 lldb 를 통해 메모리 누수를 확인하는 방법이 있다.

 

1. lldb 를 실행하여 run 하면 프로세스 ID가 나온다.

2. 다른 한 쪽에 터미널을 하나 더 띄워놓고 다음 명령어를 입력한다.

while true; do leaks (lldb에 나온 프로세스 id); sleep 0.5; done 

3. 이제 n 이나 s 등의 명령어로 차례차례 코드를 확인하며 메모리 누수가 발생하는 위치를 찾는다. 

 

lldb 사용법

맥을 쓰면 기본적으로 lldb라는 디버거가 설치되어있다. 나도 피씬 때 처음 써봤는데 익숙해지면 정말 좋다. 피씬 시험볼 때도 애용한 편.. 나는 시간이 지나면서 사람들이 디버거를 사용할 거라

hyeyoo.com

 

 

반응형
Comments