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 컨텍스트로 전환해야 합니다.
- 먼저 프로젝트를 가져옵니다(여기에 정의된 클래스 중 일부를 사용하려면).)
expr -l Swift -- import <YOUR PROJECT NAME>
- 원하는 클래스에 해당 메모리 주소를 사용하여 개체를 캐스트합니다.
expr -l Swift -- let $vc = unsafeBitCast(0x7fb7c51cb270, to: <YOUR PROJECT NAME>.<YOUR CUSTOM CLASS NAME>.self)
- 개체에서 원하는 값에 액세스
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
'programing' 카테고리의 다른 글
| Android 4.3 Bluetooth Low Energy 불안정 (0) | 2023.10.08 |
|---|---|
| 문자열에서 처음 100자 출력 (0) | 2023.10.08 |
| 쉼표 연산자에서 왼쪽 피연산자는 부작용이 없으면 실제로 실행되지 않는 것이 보장됩니까? (0) | 2023.10.03 |
| 파이썬의 요소를 얻으려면 어떻게 해야 합니까?XML 파일에 인쇄할 트리? (0) | 2023.10.03 |
| 프로그래밍 방식으로 백스택의 이전 프래그먼트로 돌아갑니다. (0) | 2023.10.03 |