Existe uma maneira de determinar a linha de código a partir da qual um determinado method
foi chamado?
ios
objective-c
debugging
nsthread
Ennuikiller
fonte
fonte
Respostas:
StackEu espero que isso ajude:
fonte
Em um código totalmente otimizado, não existe uma maneira 100% infalível de determinar o chamador de um determinado método. O compilador pode empregar uma otimização de chamada final, enquanto o compilador reutiliza efetivamente o frame de pilha do chamador para o receptor.
Para ver um exemplo disso, defina um ponto de interrupção em qualquer método usando gdb e observe o backtrace. Observe que você não vê objc_msgSend () antes de cada chamada de método. Isso ocorre porque objc_msgSend () faz uma chamada final para a implementação de cada método.
Embora seja possível compilar seu aplicativo não otimizado, você precisaria de versões não otimizadas de todas as bibliotecas do sistema para evitar apenas este problema.
E este é apenas um problema; na verdade, você está perguntando "como faço para reinventar o CrashTracer ou o gdb?". Um problema muito difícil sobre o qual as carreiras são construídas. A menos que você queira que suas "ferramentas de depuração" sejam sua carreira, eu não recomendaria seguir esse caminho.
Que pergunta você realmente está tentando responder?
fonte
Usando a resposta fornecida por intropedro , eu vim com o seguinte:
que simplesmente me retornará a classe e função originais:
ps - se a função for chamada usando performSelector, o resultado será:
fonte
Acabei de escrever um método que fará isso por você:
fonte
A versão Swift 2.0 da resposta de @Intropedro para referência;
fonte
Se for para depurar, adquira o hábito de colocar um
NSLog(@"%s", __FUNCTION__);
Como a primeira linha dentro de cada método em suas classes. Assim, você sempre pode saber a ordem das chamadas de método olhando para o depurador.
fonte
Você pode passar
self
como um dos argumentos para a função e, em seguida, obter o nome da classe do objeto chamador dentro de:Dessa forma, você pode passar para ele qualquer objeto que o ajude a determinar onde pode estar o problema.
fonte
Uma versão ligeiramente otimizada da resposta fantástica de @Roy Kronenfeld:
fonte
@ennuikiller
Na janela de saída, você verá algo como o seguinte.
Você também pode analisar essa string para extrair mais dados sobre o quadro de pilha.
Foi retirado de Identificar método de chamada no iOS .
fonte
A versão Swift 4 de @Geoff H responde por copiar e colar ;]
fonte
A versão Swift 3 de @Geoff H responde para referência:
fonte