programing

LLDB(Swift):원시 주소를 사용 가능한 유형으로 주조

mailnote 2023. 10. 3. 11:16
반응형

LLDB(Swift):원시 주소를 사용 가능한 유형으로 주조

사용 가능한 Swift 클래스에 원시 주소를 캐스트할 수 있는 LLDB 명령이 있습니까?

예를 들어,

(lldb) po 0x7df67c50 as MKPinAnnotationView

이 주소가 MKPinNotationView를 가리킨다는 것을 알고 있지만, 제가 선택할 수 있는 프레임이 아닙니다.그러나 원시 주소를 MKPinNotationView에 캐스트하여 속성을 검사하고자 합니다.가능한가요?

Xcode 8.2.1 및 Swift 3에서 lldb command poor는 입력된 변수와 함께 작동하지 않습니다.입력한 개체 인스턴스의 속성을 검사하려면 swift 명령어 인쇄를 사용해야 합니다.(cbowns의 답변 덕분에!) 예:

expr -l Swift -- import UIKit
expr -l Swift -- let $pin = unsafeBitCast(0x7df67c50, to: MKPinAnnotationView.self)
expr -l Swift -- print($pin.alpha)

스위프트의 것을 이용하시면 됩니다.unsafeBitCast객체 인스턴스에 주소를 캐스트하는 함수:

(lldb) e let $pin = unsafeBitCast(0x7df67c50, MKPinAnnotationView.self)
(lldb) po $pin

그럼 당신은 함께 일을 할 수 있습니다.$pin평소처럼 – 접속 속성, 통화 방법 등

자세한 내용은 이 기사를 확인하십시오.빠른 메모리 덤핑.

의 lldb 형식expressionXcode 7.3에서 변경된 것 같습니다.다음이 저를 시작하게 했습니다.

(lldb) expr -l Swift -- import UIKit
(lldb) expr -l Swift -- let $view = unsafeBitCast(0x7fb75d8349c0, UIView.self)

Custom Classes의 경우 프로젝트를 가져와야 합니다.

expr -l Swift -- import MyTestProject
expr -l Swift -- let $vc = unsafeBitCast(0x7fad22c066d0, ViewController.self)
expr -l Swift -- print($vc.view)

Objective-C

po ((MKPinAnnotationView *)0x7df67c50).alpha

Xcode 8/Swift 3 기준으로, 저에게 도움이 된 것은 다음과 같습니다. (이것은 @sfaxon의 답변에 근거한 것입니다.)

(lldb) expr -l Swift -- import UIKit
(lldb) expr -l Swift -- let $nav = unsafeBitCast(0x1030ff000, to: UINavigationController.self)

위의 모든 답변 덕분에 안전하지 않은 BitCast는 Xcode 8.3.2 / Swift 3 / macOS / Cocoa Application에서도 잘 작동합니다.

현재 인스턴스의 주소를 외웁니다.

(lldb) p tabView.controlTint
(NSControlTint) $R10 = defaultControlTint

(lldb) p self
(LearningStoryboard.NSTabViewController) $R11 = 0x00006080000e2280 {
.....

나중에 검사합니다.

(lldb) p unsafeBitCast(0x00006080000e2280, to: NSTabViewController.self).tabView.controlTint
(NSControlTint) $R20 = graphiteControlTint

(lldb) p $R11.tabView.controlTint
(NSControlTint) $R21 = graphiteControlTint

만약 이런 일이 생기면,

(lldb) p unsafeBitCast(0x00006080000e2280, to: NSTabViewController.self).tabView.controlTint
error: use of undeclared identifier 'to'

(lldb) p $R11.tabView.controlTint 
error: use of undeclared identifier '$R11'

스위프트 소스 코드의 스택 프레임 중 하나를 어셈블러 프레임이 아닌 하나를 선택해야 합니다.

Pause(일시 중지) 버튼을 클릭하여 응용프로그램이 일시 중지되었거나 예외적으로 중지된 경우에 발생할 수 있습니다.스택 프레임을 선택함으로써 적절한 프로그래밍 언어를 추론할 수 있습니다.

인정하고 싶다는 걸 깨닫는데 더 오랜 시간이 걸렸습니다.@afinlayson 답변과 비슷하지만, 더 나은 설명(바랍니다!)과 고정된 구문을 사용합니다.

Xcode의 뷰 계층 디버거를 사용하여 개체의 속성을 확인하려면 다음 작업을 수행합니다.기본적으로 개체 컨텍스트에 있으므로 Swift 컨텍스트로 전환해야 합니다.

  1. 먼저 프로젝트를 가져옵니다(여기에 정의된 클래스 중 일부를 사용하려면).)

expr -l Swift -- import <YOUR PROJECT NAME>

  1. 원하는 클래스에 해당 메모리 주소를 사용하여 개체를 캐스트합니다.

expr -l Swift -- let $vc = unsafeBitCast(0x7fb7c51cb270, to: <YOUR PROJECT NAME>.<YOUR CUSTOM CLASS NAME>.self)

  1. 개체에서 원하는 값에 액세스

expr -l Swift -- print($vc.<PROPERTY NAME>)

예:

expr -l Swift -- import Football

expr -l Swift -- let $vc = unsafeBitCast(0x7fb7c51cb270, to: Football.Ball.self)

expr -l Swift -- print($vc.velocity)

@XXi Chen의 답변은 LLDB 세션이 스위프트(Swift) 맥락에서 시작되었을 때 완벽하게 작동합니다.그러나 Objective-C API에 대한 상징적인 중단점이거나 Debug View Hierarchy 모드일 때(적어도 Xcode 11.4 기준)와 같이 Swift 컨텍스트 외부의 중단점에서 멈춘 경우도 있습니다.

error: unknown type name 'let'
error: use of undeclared identifier 'unsafeBitCast'

이 경우 Objective-C:를 사용하여 기존 방식으로 수행해야 합니다.

e MKPinAnnotationView *$pin = (MKPinAnnotationView *)0x7df67c50

를 할 수 .$pin자네가 원하는 대로

가장 쉬운 방법, swift 4

expr unsafeBitCast(0x7df67c50, to: MKPinAnnotationView.self)

po는 별칭입니다. 이는 무시할 수 있음을 의미합니다.다를(를) 재정의할 수 .poobjc하여 hex으로써를 하여 hex 으로써:

command regex po
s/(0x[[:xdigit:]]+)/expression -l objc -O -- %1/
s/(.+)/expression -O -- %1/

이것이 어떤 효과를 갖는지 보려면 lldb에 다음 별칭을 확장하도록 지시할 수 있습니다.

(lldb) settings set interpreter.expand-regex-aliases true

또한 저는 대용품인 https://github.com/kastiglione/swift_po, 을 만들었습니다.po스위프트를 위해서.오브젝트 주소를 처리하고 몇 가지 다른 개선점도 있습니다.

에서 lldb 를 때.NSObject와 같은 MKPinAnnotationView으로 1이 obj-cldb다를 이 거의 더 .

e -O -l objc -- 0x7df67c50

e -O --입니다에 합니다.po 컨텍스트에서 obj-c합니다 lldb에서.

언급URL : https://stackoverflow.com/questions/29441418/lldb-swift-casting-raw-address-into-usable-type

반응형