Love Every Moment
〔Debug〕에러가 어디서 났는지 모르겠다면 lldb 로 디버깅 해보자 본문
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 등의 명령어로 차례차례 코드를 확인하며 메모리 누수가 발생하는 위치를 찾는다.
'MOMENT:: RECORD > 42 SEOUL' 카테고리의 다른 글
[SOLONG] MiniLibX 라이브러리 매뉴얼 읽고 사용해보기 (0) | 2022.01.07 |
---|---|
〔AWS〕아마존 웹서비스로 EC2 서버를 구축해보자 (0) | 2021.12.22 |
〔2021 오픈소스 SW 해커톤〕이노베이션 아카데미 학장상(2위) 수상 후기와 회고록 (0) | 2021.12.09 |
〔Virtualbox〕 가상머신 사용을 위한 사전 지식 (0) | 2021.10.22 |
〔03.22-04.16〕42서울 라피신을 마치고 모아보는 기억 조각들 + 본과정 합격 (0) | 2021.04.19 |