Skip to content

Commit

Permalink
docs: LLDB
Browse files Browse the repository at this point in the history
  • Loading branch information
parkjju authored and parkjju committed Sep 7, 2024
1 parent 5eecfcd commit 756e564
Showing 1 changed file with 70 additions and 0 deletions.
70 changes: 70 additions & 0 deletions docs/lldb/lldb-1.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,73 @@ lldb를 실행해둔 터미널 탭에서 아래 명령어를 실행한다.
```

lldb와 연결된 프로세스 로그들을 `-e` 옵션 파라미터인 `/dev/ttys001`주소값을 가진 터미널로 전송하는 것을 의미한다.

:::tip 리눅스 명령어 몇가지

```bash
grep [옵션][패턴][파일명]

# 특정 파일에서 'error' 문자열 찾기
grep 'error' 파일명

# 여러개의 파일에서 'error' 문자열 찾기
grep 'error' 파일명1 파일명2

# 현재 디렉토리내에 있는 모든 파일에서 'error' 문자열 찾기
grep 'error' *

# 특정 확장자를 가진 모든 파일에서 'error' 문자열 찾기
grep 'error' *.log
```

`grep`명령어는 특정 파일에서 패턴에 해당하는 행을 출력해주는 명령어이다.

- c : 일치하는 행의 수를 출력한다.
- i : 대소문자를 구별하지 않는다.
- v : 일치하지 않는 행만 출력한다.
- n : 포함된 행의 번호를 함께 출력한다.
- l : 패턴이 포함된 파일의 이름을 출력한다.
- w : 단어와 일치하는 행만 출력한다.
- x : 라인과 일치하는 행만 출력한다.
- r : 하위 디렉토리를 포함한 모든 파일에서 검색한다.
- m 숫자 : 최대로 표시될 수 있는 결과를 제한한다.
- E : 찾을 패턴을 정규 표현식으로 찾는다.
- F : 찾을 패턴을 문자열로 찾는다.

:::

## 터미널에서 중단점 설정하기

터미널에서 lldb를 실행한다. `file 실행할_앱.app`으로 실행할 프로세스를 세팅하고, 아래 명령어를 디버거에 입력한다.

```bash
(lldb) b -[NSView hitTest:]
```

위의 `b` 명령어는 브레이크 포인트를 지정하는 것을 의미한다. `Cocoa SDK`에서 `-[NSView hitTest:]`는 이벤트 실행 루프에서 화면 탭이나 제스처를 처리하는 클래스가 무엇인지 알려주는 오브젝티브-C 메서드이다.

```bash
(lldb) continue
```

`continue`로 프로세스를 시작하고 실행한 앱을 탭하면 탭된 뷰 중단점에서 실행되는 메서드를 확인할 수 있다.

```bash
(lldb) po $arg1
```

위 명령어를 실행하면 중단점에서 히트된 뷰 주소와 정보를 확인할 수 있다. `po`는 print object를 의미하는 명령어이다. swift 객체를 쉽게 출력하기 위한 명령어이다. `NSObject`의 description 혹은 debugDescription 메서드를 제공한다.

인스턴스 출력 후에 `continue`, `po $arg1` 명령어를 계속 번갈아 사용하게 되면 UI 리스폰더 체인에 따라 내부 하위계층 서브뷰들이 계속해서 출력되는 것을 볼 수 있다. `arg1`은 브레이크 포인트로 영향받는 코드의 가상주소를 나타낸다.

```bash
(lldb) breakpoint delete
```

위 명령어는 설정해둔 중단점들을 삭제하는 명령어이다.

```bash
(lldb) breakpoint set -n "-[NSView hitTest:]" -C "po $arg1" -G1
```

위 명령어를 입력하면 설정한 오브젝티브 C 메서드에 대해 `po $arg1`명령어를 재귀적으로 계속 실행한다는 것을 의미한다. LLDB 디버깅 시 스위프트 환경에서 할 수도 있는데, Foundation과 같은 모듈들을 불러오는 데 시간이 오래 소요되고 성능도 떨어지기에 오브젝티브C 기반으로 디버깅하는 것이 좋다.

0 comments on commit 756e564

Please sign in to comment.