LLDB

LLDB (5) - 오픈소스 스크립트 (Derek Selander)

GREEN.1229 2021. 4. 21. 12:53

안녕하세요. 그린입니다🟢

이번 포스팅에서는 이제 LLDB의 기본적으로 제공되는 명령어를 넘어 다양한 오픈소스 스크립트를 통해 활용하면 좋을 명령어들에 대해 알아보겠습니다🧑🏻‍💻

왜 오픈소스 LLDB 스크립트를 알아야할까?

 - 사실 몰라도 상관없습니다. 다만 여태 명령어들을 복잡하게 조합하여 LLDB 명령어들을 썼던 부분들에 대해 오픈소스에서는 이미 그런 명령어들을 좀 더 편리하게 쓰도록 조합해놨기에 쓰면 훨씬 편리하겠죠?😁

오픈소스를 가져다 쓰는 방법

 1. HomeBrew를 통해 라이브러리를 다운하여 .lldbinit 파일에 넣는 방법

 2. 오픈소스 깃헙을 클론해서 경로를 가지고 .lldbinit 파일에 넣는 방법

.lldbinit 파일이란?

 - lldb를 실행 시 초기파일로 앞서 설명한 alias와 같이 지정해놓고 싶거나 아니면 오픈소스를 가져와 추가해서 사용할 수 있습니다.

 - 해당 파일은 홈 디렉토리에 숨겨진 파일로 위치해있으며 없다면 생성하면 됩니다🤖

 

"그렇다면 이제 편리하게 쓸 수 있는 오픈소스 스크립트에 대해 알아보겠습니다. 오늘은 Derek Selander라는 개발자가 만든 오픈소스에 대해 가져와보고 실습해보겠습니다!!!"

 

Derek Selander 오픈소스 스크립트 가져오기

 1. https://github.com/DerekSelander/LLDB (깃헙 접속)

 2. 해당 레파지토리를 클론하여 원하는 위치에 저장

 3. ~/.lldbinit 파일 오픈

 4. command script import "클론받은 경로"/LLDB/lldb_commands/dslldb.py를 파일에 작성 및 저장

 

Derek Selander LLDB Script

 - search: 특정 클래스의 모든 활성 인스턴스에 대한 힙 검색

  -> UIView의 인스턴스 및 서브클래스 탐색

  -> -e 옵션을 줄경우 서브클래스는 무시하고 인스턴스만 탐색

 

 - dclass: 프로세스의 모든 NSObject / SwiftObject가 상속된 클래스의 정보를 출력

 - section: 프로세스에 실행된 파일/프레임워크의 Mach-O 세그먼트 데이터 표시

 - dd: disassemble 명령을 알아보기 쉽게 색상으로 표시 (터미널 전용)

 

 - lookup: 해당 메서드를 포함하는 모든 메서드 추적 (image lookup 기능과 비슷)

   -> -s 옵션을 주어 축약하여 출력

 

Derek Selander LLDB Command

 - ls: 실행중인 앱의 기기의 디렉토리를 출력

   -> (lldb) ls "찾으려는 디렉토리 경로"

 - reload_lldbinit: lldbinit 파일의 내용을 다시로드 (Xcode 재시작 없이도 가능)

 - tv: 현재 뷰에서 히든된 값을 전환

 - pprotocol: 해당 프로토콜에 대한 모든 메서드 정보 출력

 - pframework: 프레임워크 위치 출력

 - sys: 명령 실행을 위한 쉘로 이동 ( 명령어 사용 가능하게 LLDB 콘솔에서)

 

 - methods: 객체에서 사용 가능한 모든 메서드 정보 출력

 - ivars: NSObject에서 상속된 객체의 인스턴스에 대한 모든 변수정보 출력

 - dumpenv: 프로세스 환경 변수 정보 출력

 

 - keychain: 프로세스 관련 키체인 DB 정보 덤프

(lldb) keychain
<__NSArrayM 0x600001fb1590>(
{
acct = "localdevice-AuthToken";
agrp = apple;
"v_Data (str)" = "A8CD94D2-13E3-40B...

 

"이외에도 info / lsof 등 다양한 명령어가 존재"

 

 

[느낀점]

여태까지 기본적으로 제공되어 사용하는 LLDB 명령어를 익혔을때도 이걸 언제 다 외우지 또는 이걸 어떤 상황에서 어떻게 조합해서 사용할까 였는데 그런 걱정들을 해결해줄 수 있는게 오픈소스라고 느껴졌다. 특히 Derek Selander의 명령어를 사용하며 tv / ls / pprotocol 명령어는 지금 내 상황에 더 유용하게 사용될 수 있을것 같다. 정말 많은 LLDB를 편리하게 사용할 수 있는 오픈소스가 있겠지만 우선 기본에 충실하고 오늘 배운 오픈소스와 뷰 디버깅에 유용한 Chisel까지만 욕심내서 해보고 다져봐야겠다🧐

 

[참고자료]

https://github.com/DerekSelander/LLDB

https://yagom.net/courses/start-lldb/