lldb는 Mac os에서 기본적으로 제공되는 디버거이다. 일반적으로 다른 디버거를 쓸 수 없는 환경에서 이를 활용하면 좋다.
lldb는 컴파일된 파일에 대해 디버깅을 해줄 수 있다. 따라서 먼저 컴파일 작업을 하는 것이 필요하다.
중요한 점 하나는 컴파일을 해 줄 때에 -g
옵션을 주고 컴파일을 해야한다. (그렇지 않으면 c 가 아니라 어셈블리 단위로 디버깅을 하게 될 것이다) 또한 함수 동작 전체를 디버깅하기 때문에 의존성이 있는 라이브러리 등이 있다면 같이 컴파일을 해주어야 한다.
debug : fclean #이전에 만들어놓은 목적파일과 a파일 out파일 등을 삭제한다.
make all -C "./libft" #의존성이 있는 라이브러리들을 make 한 뒤
cp ./libft/$(LIB_NAME) $(LIB_NAME) #생성한 라이브러리 파일을 루트 디렉토리로 복사하고
gcc -g ${SRCS} $(LIB_NAME) main.c #컴파일을 한다.
lldb a.out #생성된 out파일로 lldb를 실행한다.
이렇게 컴파일을 한다면 정상적으로 lldb 가 가동되는 것을 볼 수 있다.
이 상태로 코드를 돌려보고 싶다면 run
명령어나 r
명령어를 입력하면 된다. 매개변수를 넣어주고 싶으면 한 칸을 띄우고 run "hello"
와 같이 입력하면 argv[n]
으로 매개변수를 받아 작동하게 할 수 있다. 그러나 이 상태에서는 코드의 세부적인 내역을 볼 수 없다. 우리가 보고 싶은 것은 더 자세한 부분이지 코드의 동작 여부가 아닐 것이다.
코드의 진행 중간에 더 자세한 부분을 보고 싶으면 먼저 코드가 run
하는 도중에 멈추어서 조정할 수 있는 구간인 브레이킹 포인트를 설정하여야 한다. 브레이킹 포인트는 b
명령어를 이용해서 설정할 수 있으며, 아래의 규칙을 따른다.
b [filename]:[line_number]
브레이킹 포인트를 설정하고 run
을 실행하면 그 라인이 실행되기 전에 멈추어서 유저의 지시를 기다리게 된다. ******이렇게만 이야기하면 애매하니 구체적인 상황을 상정하여 해보자.
나는 ft_printf.c
파일 안에 위와 같이 파일을 작성했다. 함수 vsprintf
는 fmt에서 '%'가 있을 때, 80번 라인에서 ft_call_parserset
를 실행한다. ft_call_parserset
함수는 파싱함수들을 호출해서, 첫번째 매개변수로 들어온 fmt
문자열을 파싱하여 구조체 info
에 정보를 기록한다. 그런 뒤에 81번째 라인에서 ft_printf_call_handler
를 호출하여 구조체 info
에서 기록된 정보에 따라 출력한다. 그 뒤 해당 함수는 표준출력으로 출력한 문자열의 길이만큼 ret
에 정수를 더해준다. vsprintf
는 이렇게 매개변수 첫번째인 문자열 전체를 출력하여 반환된 ret
을 반환한다.