# LLDB 프로세스 연결

LLDB가 직접 프로세스에 연결되는 것은 아니고, Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/ 경로에 있는 debugserver라는 프로그램이 대상 프로세스에 연결하는 역할을 한다.

LLDB가 프로세스에 연결되는 과정을 알기 위해 직접 컨트롤 가능한 간단한 프로그램을 생성해야 한다.

전역 위치의 tmp 디렉토리에 이동한다. 해당 디렉토리는 리부트 이후에 비워진다.

$ cd /tmp

해당 디렉토리에서 텍스트 편집기 vim 혹은 nano를 활용하여 스위프트 파일을 하나 생성한다. 파일명은 아무렇게나 해도 되고 여기서는 hello_world.swift로 하고 있다.

import Foundation

print("Hello World!")
CFRunLoopRun()

이후 해당 스위프트 파일을 컴파일하고 실행한다.

$ swiftc hello_world.swift
$ ./hello_world

프로그램 실행 시 &를 뒤에 붙이면 해당 프로세스를 백그라운드에서 실행하겠다는 것을 의미한다.

$ ./hello_world &

백그라운드에서 실행해도 되고 터미널 탭을 하나 추가하여 독립적인 프로세스로 실행해도 된다.

프로세스가 실행시켜놓고 lldb -n hello_world를 입력하면 해당 프로그램을 디버깅하기 시작한다. lldb 모드로 정상적으로 진입하면 디버거가 프로세스와 연결된 것이다. quit 혹은 q를 입력하여 프로세스로부터 detach할 수 있다.

프로세스 이름 뿐만 아니라 프로세스 ID값으로도 연결할 수 있다. lldb -n ...은 프로세스 이름을 기준으로 연결을 요청하는 것이고, lldb -p 숫자는 프로세스 아이디 값을 기준으로 연결을 요청하는 것이다.

실행중인 프로세스를 죽이기 위해서는 아래 명령어를 입력한다.

$ pkill hello_world

# 프로세스 연결 감지

위 명령어는 실행중인 프로세스에 접근하여 디버거와 연결하는 역할을 한다. -w 옵션을 붙이면 현재 실행중인 프로세스가 아닌, 앞으로 새로 연결될 프로세스를 감지하는 역할을 한다.

$ lldb -n 프로그램명 -w

위 명령어로 프로세스 연결을 감지한 상태로 새로운 터미널에서 실행파일을 실행하면 lldb 디버거가 연결된다.

-w옵션은 기존에 실행중인 프로세스가 만약 있었다고 해도 해당 프로그램 이름에 대해 새로운 프로세스가 할당되는 것만 감시한다.