Existe um comando LLDB que pode converter um endereço bruto em uma classe Swift utilizável?
Por exemplo:
(lldb) po 0x7df67c50 as MKPinAnnotationView
Eu sei que este endereço aponta para um MKPinAnnotationView, mas não está em um quadro que posso selecionar. Mas, eu quero converter o endereço bruto em um MKPinAnnotationView para que possa examinar suas propriedades. Isso é possível?
(lldb)
no meu console. Mas não funcionou sem isso.expr -l Swift --
..Você pode usar a
unsafeBitCast
função do Swift para lançar um endereço para uma instância de objeto:Então você pode trabalhar
$pin
como de costume - propriedades de acesso, métodos de chamada, etc.Confira este artigo para obter mais informações: Despejo de memória Swift .
fonte
(lldb) settings set target.language swift
. Além disso, em alguns casos (por exemplo, ao quebrar fora do módulo do seu aplicativo durante a transmissão para um tipo do seu aplicativo), você pode precisar seguir com ume import MyApp
O formato lldb para
expression
parece ter mudado no Xcode 7.3. O seguinte me ajudou a começar:fonte
Para aulas personalizadas, você precisa importar seu projeto
fonte
No Xcode 8 / Swift 3, aqui está o que funcionou para mim. (Isso é baseado na resposta de @sfaxon .)
fonte
Graças a todas as respostas acima, unsafeBitCast também funciona bem com o aplicativo Xcode 8.3.2 / Swift 3 / macOS / Cocoa.
Memorize um endereço da instância atual
Mais tarde, examine-os
Se algo assim acontecer
certifique-se de escolher um dos frames de pilha do código-fonte Swift em vez de um montador.
É provável que aconteça quando o aplicativo foi pausado ao clicar no botão Pausar ou interrompido com uma exceção. Ao escolher um frame de pilha de acordo, deixe lldb inferir uma linguagem de programação adequada.
fonte
Versão Objective-C
fonte
Debug View Hierarchy
visualização, cliquei com o botão direito do mouse em uma visualização e selecioneiPrint description of...
. Isso me deu um endereço de memória e tipo que eu poderia inserir no código acima. É bom saber que o depurador visual coloca o console em um quadro Obj-C.Levei mais tempo para descobrir o que gostaria de admitir. É semelhante à resposta @afinlayson, mas com melhor explicação (espero!) E sintaxe fixa
Se você quiser verificar as propriedades de um objeto usando o depurador de hierarquia de visão do Xcode, isso funcionará: Você está no contexto do objeto por padrão, então terá que alterná-lo para o contexto 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>)
Exemplo:
expr -l Swift -- import Football
expr -l Swift -- let $vc = unsafeBitCast(0x7fb7c51cb270, to: Football.Ball.self)
expr -l Swift -- print($vc.velocity)
fonte
A resposta de @Xi Chen funciona perfeitamente quando sua sessão LLDB foi iniciada em um contexto Swift. No entanto, em alguns casos, você pode ter parado em um ponto de interrupção fora de um contexto Swift; por exemplo, quando é um ponto de interrupção simbólico para a API Objective-C ou quando está no modo Debug View Hierarchy (pelo menos a partir do Xcode 11.4).
Nesse caso, você precisará fazer da maneira antiga, usando Objective-C:
e agora você pode usar
$pin
como faria.fonte
po
é um alias, o que significa que pode ser substituído. Você pode substituirpo
manipulando endereços hexadecimais usando objc:Para ver o efeito que isso tem, você pode dizer ao lldb para expandir estes aliases:
Além disso, criei https://github.com/kastiglione/swift_po , que é um substituto
po
do Swift. Ele lida com endereços de objetos e também possui algumas outras melhorias.fonte
expression -l objc -O -- 0x76543210
é só a resposta pra mim, e não precisa saber a classe da variável do endereço!A maneira mais fácil, rápida 4
fonte