ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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로 칭하지 않았을까 생각이든다. 알면 알수록 정말 디버깅으로 많은것을 할 수 있고 개발 효율을 높일 수 있는것 같다고 생각된다☺️

     

    [참고자료]

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

    https://lldb.llvm.org/use/map.html

    '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
Designed by Tistory.