-
LLDB - 명령어 (4)LLDB 2021. 4. 20. 11:54
안녕하세요. 그린입니다🟢
오늘 포스팅에서는 LLDB에서 모듈 내 자세한 정보를 얻는 Image 명령어와 명령어에 별칭을 부여하여 사용하는 Alias 명령어에 대해 알아보고 학습하겠습니다🧑🏻💻
Image?
- (lldb) image subcommand
- 모듈 내 심볼의 정보를 얻는 명령어로 세밀한 정보 탐색이 가능
- 해당 기능을 통해 숨겨지거나 세부적인 private한 정보를 얻을 수 있음
Module & Symbol?
- 모듈은 프로세스에서 실행되는 프레임워크/라이브러리 등 모든것을 말함
- 심볼은 소스코드를 구성하는 단위로 메서드/변수/클래스 등을 전부 심볼로 볼 수 있음 (코드 자체라고 보면됨)
SymbolTable?
- 컴파일된 2진 표현인 binary를 각 코드의 해당하는 심볼로 매핑해주는 기능으로 개발자가 알아볼 수 있게 만들어줌
- Symbolicate 한다고 표현
- symtab 옵션으로 사용됨
ImageList?
- (lldb) image list
- 현재 로드되어 불러진 모든 모듈의 정보를 리스트로 나타냄
- Index / UUID / Address / Path 순으로 출력
- 처음 Index 정보는 메인
- 2,3번째 Index 정보는 dynamic Library link 에디터
- 4번째 Index 정보는 Foundation 라이브러리
Image Dump?
- (lldb) image dump
- 모듈의 더 세부적인 정보를 출력
- 프로젝트 모듈에 포함된 변수/메서드/클래스/메타데이터/프로토콜 등 모든 심볼이 나타남
- -s address는 주소값 순으로 정렬하는 옵션
- 프라이빗한 API (숨겨진 API)에 대해서도 접근 및 디버깅이 가능
Image Lookup?
- (lldb) image lookup
- 방대한 dump 정보를 필터링해서 간략하게 보여줌
- 옵션을 통해 함수명 / 주소값 / 파일명 / 정규식 등 원하는 조건으로 필터링을 걸어 추출해서 볼 수 있도록 제공됨
- 앱을 개발하고 디버깅을 하다가 해당 프레임워크나 라이브러리등에 어떤 숨겨진 제공 요소가 있는지 찾고 사용해볼 수 있음
Symbolicate?
- Symbolicate를 거치지 않으면 날것 그대로의 바이너리한 로그를 볼 수 있고 Symbolicate를 거치면 개발자가 알아볼 수 있게 변환된 친절한 로그를 볼 수 있음
- 거치지 않으면 바이너리 주소값으로만 전부 되어 있는 로그
- 즉 해당 기능은 컴파일된 주소값을 알아볼 수 있는 심볼로 매핑해주는 기능
- 거치지 않은 정보로 주소값을 계산하여 문제의 주소를 찾을 수 있음 (주소를 계산하고 image lookup을 통해 주소에 대한 정보를 관찰하면됨)
Alias?
- (lldb) command alias 별칭 "별칭을 부여하려는 명령어"
- 반복 사용하거나 복잡한 정규식 같은 명령어에 대해 타입 별칭처럼 줄여서 사용할 수 있는 기능
- 별칭을 등록하고 빌드가 종료되면 초기화됨 ( ./lldbinit 파일을 생성하여 담아둔다면 계속 사용 가능)
[느낀점]
po를 통해 객체에 대한 다양한 정보에 대해 출력하여 확인해봤는데 이번 image 명령어와 기능을 통해 좀 더 자세하고 세밀한 정보에 대한 탐색을 학습한 느낌이 들었다. 또한 개발중에 외부 프레임워크나 라이브러리를 사용할때도 어떤 모듈과 메서드들이 들어있는지도 확인하여 사용해볼 수 있으며 크래쉬가 날때도 바이너리한 주소값을 계산하거나 변환된 정보를 통해 좀 더 편리하게 디버깅을 할 수 있을것 같다. 왜 image라는 명령어 이름을 붙였는지는 처음에부터 지금까지 매칭이 잘 되지 않지만 아마 정보의 세밀한 부분들을 사진처럼 보여주는것 같아 image로 칭하지 않았을까 생각이든다. 알면 알수록 정말 디버깅으로 많은것을 할 수 있고 개발 효율을 높일 수 있는것 같다고 생각된다☺️
[참고자료]
'LLDB' 카테고리의 다른 글
LLDB (6) - 오픈소스 스크립트 (Chisel) (0) 2021.04.22 LLDB (5) - 오픈소스 스크립트 (Derek Selander) (0) 2021.04.21 LLDB - 명령어 (3) (2) 2021.04.19 LLDB - 명령어 (2) (0) 2021.04.17 LLDB - 명령어 (1) (0) 2021.04.16