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 가 가동되는 것을 볼 수 있다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ec9e9227-a61b-485d-b0b6-8ce87d08b39a/Untitled.png

이 상태로 코드를 돌려보고 싶다면 run 명령어나 r 명령어를 입력하면 된다. 매개변수를 넣어주고 싶으면 한 칸을 띄우고 run "hello" 와 같이 입력하면 argv[n]으로 매개변수를 받아 작동하게 할 수 있다. 그러나 이 상태에서는 코드의 세부적인 내역을 볼 수 없다. 우리가 보고 싶은 것은 더 자세한 부분이지 코드의 동작 여부가 아닐 것이다.

브레이킹 포인트 - b

코드의 진행 중간에 더 자세한 부분을 보고 싶으면 먼저 코드가 run 하는 도중에 멈추어서 조정할 수 있는 구간인 브레이킹 포인트를 설정하여야 한다. 브레이킹 포인트는 b 명령어를 이용해서 설정할 수 있으며, 아래의 규칙을 따른다.

b [filename]:[line_number]

브레이킹 포인트를 설정하고 run 을 실행하면 그 라인이 실행되기 에 멈추어서 유저의 지시를 기다리게 된다. ******이렇게만 이야기하면 애매하니 구체적인 상황을 상정하여 해보자.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/85fb92dc-abf0-43a0-ad9d-98f3bb0626e1/Untitled.png

나는 ft_printf.c 파일 안에 위와 같이 파일을 작성했다. 함수 vsprintf는 fmt에서 '%'가 있을 때, 80번 라인에서 ft_call_parserset 를 실행한다. ft_call_parserset 함수는 파싱함수들을 호출해서, 첫번째 매개변수로 들어온 fmt 문자열을 파싱하여 구조체 info에 정보를 기록한다. 그런 뒤에 81번째 라인에서 ft_printf_call_handler를 호출하여 구조체 info 에서 기록된 정보에 따라 출력한다. 그 뒤 해당 함수는 표준출력으로 출력한 문자열의 길이만큼 ret 에 정수를 더해준다. vsprintf 는 이렇게 매개변수 첫번째인 문자열 전체를 출력하여 반환된 ret 을 반환한다.