LLDB)야무진 디버깅을 위해 LLDB 기초를 배워보자

2021. 10. 17. 23:04iOS/iOS memo

728x90
반응형
본 포스팅은 아래의 링크를 참고하여 작성되었습니다. 번역이 어색하게 느껴지면 댓글로 제게 도움을 주세영..

 

안녕하세요 bannavi입니다^ㅅ^

 

오늘은 디버깅 스킬 향상을 위해 LLDB를 배워볼거에요.

디버깅이 중요하단 말은 많이 들어봤는데.. break point를 어디에 걸어야될지 모르겠어.. 오류추적을 대체 어떻게 하라는거지..

알 수 없는 오류땜에 킹받네....ㅠㅠ

 

이런 고민.. 저만 해본거 아니죠?^ㅅ^

 

오늘은 이런 고민을 해결하고, 오류에 좀더 능숙하게 대응하기 위해 LLDB를 배워보는 시간을 갖겠습니다.

LLDB가 무엇인지 알기 위해서는, 먼저 LLVM에 대한 간단한 이해를 하는 것이 좋아요!

 

 

LLVM

1. Apple 에서 진행한 Compiler에 필요한 Toolchain 개발 프로젝트
2. 각 컴포넌트들의 재사용성을 중시해서, 모듈화가 잘 되어있다는 특징
3. 모듈화 되어있는 컴포넌트들을 이용해 진행된 주요 서브 프로젝트들로는 LLVM Core, Clang, libc++, LLDB 등이 있음

 

 

LLDB

1. LLVM의 Debugger Component를 개발하는 서브 프로젝트
2. LLVM 프로젝트를 통해 개발된 Clang Expression Parser, LLVM Diassembler 등 Low-Level 컨트롤이 가능한 모듈들로 이루어져 있어, 기계어에 가까운 영역까지 디버깅 가능하다는 장점
3. C, C++, Objective-C, Swift를 지원하며, 현재 Xcode의 기본 디버거로 내장
4. 실제 프로그램이 어떤 식으로 동작하는지 더 깊이 이해할 수 있음.(오 제일 궁금했던 점)

 

LLDB명령어의 문법

LLDB명령어 예시

1. Command: 예) breakpoint, watchpoint, set...

2. Subcommand: Command에 따라 사용할 수 있는 종류가 달라집니다.

3. Option: -(hyphen으로 시작)

4. Argument: 공백이 포함되는 경우도 있어 ""로 묶어줄 수 있습니다.

 

Help

해당 문법으로 사용 가능한 Subcommand, Option리스트나 사용법을 보여주는 유용한 명령어

 

Apropos

원하는 기능의 명령어가 있는지 관련 키워드를 통해 알아볼 수 있는 명령어

 


데이터를 보는 방법 세가지(po, p, fr v)

 

1. po

2. p

3. fr v

 

lldb사용하는 방법

자신의 프로젝트에 브레이크 포인트를 걸어줍니다.

아래와같이 디버거가 breakpoint에서 중단되면,

 

 

이렇게 Console창에 디버그 명령을 입력할 수 있도록 뜹니다. 11db아니고 lldb ㅎ_ㅎ

 

저는 po와 함께 cell의 label을 입력해줘봤습니다.

 

그리고 enter를 눌렀더니 아래와 같이 떴어요.

po명령어의 경우, UILabelClass는 console에 인쇄되는 문자열을 반환하는 디버그 설명 메서드를 실행합니다.

 

 

이번엔 po가 아니라 p를 입력해볼거에요

 

와앙...핵길다! 난리난리..!ㅋㅋ

이번엔 디버거가 기본 제공 포매터를 사용해서 label의 속성을 표시합니다.

 

왼쪽에 있는 Variables View입니다.

cell이 label을 그릴때 변수 보기에서 볼 수 있는것과 동일한 속성입니다.

 

p는 print를 나타내는것으로 생각할 수 있지만, help p를 입력해보겠습니다.

영어로 뭐라뭐라 하는데..! 맨 아랫줄을 보면 p는 expression -- 의 약자 임을 알 수있네요.

 

data를 print할때 뿐만 아니라 p는 메서드를 실행하는데에도 사용할 수 있다는 의미입니다.

이것이 이러한 명령으로 부작용을 생성할 수 있는 이유라고 하는데요!

의도적으로 메서드를 실행하지 않더라도 보고있는 데이터에 대한 속성 접근자가 부작용을 일으킬 수 있습니다...라는데

(저는 여기서부터 동공지진이!ㅋㅋㅋㅋㅋ)

제 느낌에는 po를 이용해서 임의의 변수도 넣어줄 수 있는데 fr v는 코드를 실행하지 않고, 내장포매터로 데이터를 검사할 뿐이기때문에

부작용이 없다는것 같습니다. (이거 제 설명이 맞는지 저도 헷갈리는데 ㅠ..ㅠ 자세히 알게되면 추가하겠습니다.)


(일단 이건 강의화면..)

p 어쩌구를 출력했을땐 nil이 나왔는데

 

이 상태에서 fr v self.~를 해보면

이번엔 이상한 nil이 아니라 어떤 친절한 문장이 출력되네요.

예를들면 아래처럼 clearfeed가 self.photoFeed의 구성원이 아니라는..

아.. 뭔가 요놈은 내장된 포매터라는걸로 얘는 우리 구성원이다 아니다를 true, false로 판단해주는 녀석같아요.

있으면 코드를 보여주고 아니면 아래와 같이 얘 우리 구성원 아닌데..이렇게말이에요.

뭔가 코드를 고쳐주진 않는것 같고요

 

이번엔 제 프로젝트에서  fr v cell.label을 입력해볼게요

이번엔 동일한 내장 포매터를 사용해서 label을 표시합니다.(label이 이미 있는녀석이라 이번엔 아래처럼 코드로 보여주는것같아요)

 

LLDB 너 이자식ㅠ

정리해볼게요

 

po 및 p명령은 모두 디버거가 생성한 범위에서 코드를 실행한다는것을 의미하는 expression의 약어입니다.

속성 및 이와 유사한것에 액세스할때 자체 추론을 포함하여(임의로 변수의 값을 수정해볼 수 있는걸 말하는것같아요) 코드를 활용합니다.

 

하지만 fr v는 코드를 실행하지 않고, 데이터를 검사할 뿐입니다. 있으면 보여주고? 없으면 얘 우리 구성원 아니거든! 하면서 안보여주고요

그래서 더 안전하다고 합니다.(동시에 제한적)

 

흠 간단한 느낌은 알겠는데 공부를 더해야겠네요........역시 포스팅 하나로 끝날것이 못되는군

흑흑 디버깅킹하고싶당


 

참고

야곰닷넷

raywenderlich.com

iCode

 

 

728x90
반응형