들어가며
디버깅을 보다 생산적으로 만들 수 있는 breakpoint improvement를 알아보자!
breakpoint
1.
프로세스 상태를 검사해서 상황을 자세히 파악하기
2.
프로세스 실행을 통해서 논리를 확인하기
두 상황 다 버그가 발생하기 직전에 일시 중지해야 한다.
breakpoint를 사용하게 된다.
3가지 일반적인 breakpoint를 알아보자.
Source file breakpoints
•
single file
•
Line breakpoint
•
검사하려는 코드 줄에서 일시 중지하는 데 적합
가장 빠른 사용 방법
일시 중지할 줄 바로 옆에 있는 gutter를 클릭하는 것
line breakpoint가 충분히 세분화되지 않은 경우가 있기 때문에 발생
why?
LLDB가 정지할 위치를 하나 이상 생성했기 때문이다.
Xcode 13에서는 Column breakpoint를 도입하고 있습니다.
이렇게 하면 특정 expression에서 일시 중지해야 할 때 생기는 line breakpoint의 단점을 방지한다.
expression를 클릭해서 pop over를 연 다음에 Set Column Breakpoint를 선택합니다.
•
비활성화, 활성화 가능
•
breakpoint를 수정해야하는 경우, 두 번 클릭
Control 또는 마우스 오른쪽 버튼을 클릭하면 이전 작업이 포함된 상황별 메뉴가 나타납니다.
Xcode 11.4에서는 Column PC를 도입해서 expression 아래에 녹색 밑줄을 그려 일시 중지된 column를 표시합니다. 따라서 디버거가 다음에 실행할 식을 알 수 있습니다.
Column breakpoint는 특히 Swift Closure나 Objective-C의 Block에 유용합니다.
•
컴파일러는 디버그 조건에서 파일을 컴파일할 때 source line과 column을 컴파일된 주소로 매핑하는 line table를 만듭니다.
•
이 line에 있는 각 클로저에 대해 컴파일러는 디버거가 일시 중지하는 데 사용할 line table 항목을 생성합니다.
만약 $0를 검사하고 싶다고 가정하면,
breakpoint를 line 269로 설정할 수 있지만, 일시 중지한 후에 마지막 closure에 도달하려면 생성된 line table 항목으로 인해서 수많은 step in과 step out를 수행해야 합니다.
Symbolic breakpoints
•
breakpoints on function names → pause the process when functions are executed.
•
원본 파일 breakpoint를 사용할 수 없거나 불편할 때 매우 유용
◦
source file에 access할 수 없어서 디버그 정보로 컴파일할 수 없을 때
◦
공통 기능을 구현하는 많은 하위 클래스가 있으며 각 하위 클래스마다 파일 breakpoint를 설정하는 건 매우 번거로운 일
1.
breakpoint navigator 하단에 있는 추가 버튼을 눌러서 추가합니다.
2.
Symbolic breakpoint를 누르면 즉시 breakpoint navigator에 나타납니다.
3.
예를 들어서 우리가 toggle 함수를 일시 중지하는 데 관심이 있다고 가정을 하고 넣어봅니다.
Why?
LLDB가 시스템 라이브러리를 포함하여 프로세스에서 로드되는 모든 라이브러리의 이름과 일치하기 때문입니다!
breakpoint의 위치가 여러 개가 될 수 있으며, 때로는 수천 개가 될 수 있어요.!
모듈은 main binary를 포함하여 실행 중에 로드할 수 있는 binary or image입니다.
예시에서는 앱의 바이너리 이름은 “Fruta”를 넣었습니다.
세 곳의 위치를 빠르게 찾았습니다.
[
좋아요 버튼을 누르자, toggle 함수가 실행되는 모습 ]
symbolic breakpoint의 경우, typographic error를 범하기 상당히 쉽다.
우리는 프로그램을 실행하는 동안 breakpoint에 부딪히지 않고 머리를 긁적이게 됩니다.
⁇
convertToMass라고 불리는 것을 만들어봐요.
Xcode 13의 새로운 기능으로 LLDB에 의해 breakpoint가 어떤 위치에서도 해결되지 않으면 점선 아이콘으로 표시됩니다.
unresolved breakpoint 아이콘 위로 마우스를 가져가면 도움이 되는 툴팁을 제공합니다.
1.
이름은 정확하게 철자를 써야 하고 기호는 라이브러리에 존재해야 합니다.
2.
breakpoint에 대한 라이브러리 로드 → LLDB가 자동으로 breakpoint을 해결
네비게이터를 사용하여 convert 를 찾아볼 수 있겠죠.
but, 분석하려면 시간이 좀 걸리겠네요;
LLDB를 통해서 다른 방법을 사용합시다!
image lookup -rn convert Fruta
module : image, regex : lookup -r, name: n, convert를 Fruta에 입력해서 검색하는걸로 제한합니다.
이름 철자가 확실히 틀렸네요.
Unresolved breakpoint는 source file breakpoint에서도 볼 수 있습니다.
Unresolved된 이유는
1.
breakpoint에 대한 line를 컴파일해야 합니다.
•
예시에서는 컴파일러 조건이 다른 부분에 있기 때문에 컴파일되지 않았다.
2.
컴파일러는 모듈에 대한 디버그 정보를 생성해야 합니다.
•
그렇지 않은 경우 빌드 설정을 확인해야 합니다.
Runtime issue breakpoints
•
background thread에서 UI 상태를 변경하는 등의 런타임에 발생하는 문제
•
crash만큼 심각하지는 않으며, 기본적으로 Xcode는 프로세스를 일시 중지하지 않음
◦
다른 버그에 초점을 맞출 때 너무 큰 문제가 발생할 수 있기 때문
◦
대신 런타임 문제가 발생하면 Xcode는 backtrace를 기록하고 이슈 탐색기에 표시합니다.
runtime breakpoint를 사용하면 디버거에서 일시 중지하고 프로세스를 탐색할 수 있습니다.