반응형

두가지 방법이 있음.

(1) 아이폰에 로컬 환경 구축.

(2) mac에 원격 환경 구축.

 

■iPhone에 iOS App 로컬 lldb 환경 구축

cydia에서 lldb-10 검색하여 설치하면 끝.

 

아이폰 단말기에서 lldb-10 -n <process name> 명령어로 attach 가능.

이후 lldb 명령어 참조하여 대상 앱 동적 디버깅 수행.

 

 

■mac에 iOS App 원격 lldb 환경 구축

macOS 10.14.4 VM / iOS 12.4(checkra1n JB) 에서 테스트

 

- mac에서

터미널에서 다음 명령어 수행

hdiutil attach /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/12.4/DeveloperDiskImage.dmg

 

현재 디렉터리로 debugserver 복사

cp /Volumes/DeveloperDiskImage/usr/bin/debugserver ./

 

다음 entitlements.plist 파일 이용하여 debugserver 사이닝

entitlements.plist
0.00MB

codesign -s - --entitlements entitlements.plist -f debugserver

 

debugserver 실행파일을 아이폰의 /usr/bin/ 디렉터리 하위로 옮겨주고, 실행권한 755 할당

 

 

- 아이폰에서

appName은 앱 실행하고 나서 ps -ef 로 확인. 포트는 임의 지정가능. IP를 wildcard("*")로 지정 불가하므로, mac IP주소를 정확히 지정해줘야 함

debugserver <mac IP>:6666 -a <appName>

 

- mac에서

lldb

platform select remote-ios

process connect connect://<아이폰 IP>:6666

 

process attach 된 후에는 lldb 명령어 참조하여 동적디버깅 수행

 

※ lldb 주요 명령어

po $x0

객체(ex. x0 레지스터)의 description 메서드 호출

p  

primitive 값 출력

br list  

브레이크 포인트 리스트 출력

br delete 1    

브레이크 포인트 삭제

br set -n viewDidLoad    

특정 메서드이름을 가지는 곳에 브레이크 설정

br set -a <address>   

특정 주소값에 브레이크 설정

c    

Process Continue

n    

Next(Step Over). branch 포인트가 있다면 branch된 함수 안으로 들어가지 않고 다음으로 넘어감

s

Step In. branch 포인트가 있다면 branch된 함수 안으로 들어감

finish

Step out. 함수에서 빠져나옴

bt

backtrace. 브레이크 포인트를 통해 멈춰진 곳이 어떤 경로를 통해 호출되었는지 보여줌

bt all

모든 thread의 backtrace 출력

thread list

thread 목록 출력

thread select 1

1번째 thread로 이동

frame info

frame 정보 출력

frame select 2

2번째 frame 선택

watchpoint list

watchpoint 목록 출력

watchpoint delete 1

1번째 watchpoint 삭제

watchpoint set variable _x

watchpoint 설정

register read -A

모든 레지스터에 저장된 값 출력

register read x0

x0 레지스터에 저장된 값 출력

 

※ 출처

https://kov4l3nko.github.io/blog/2016-04-27-debugging-ios-binaries-with-lldb/

 

 

반응형

+ Recent posts