Como simbolizar o Xcode do log de falha?

188

O organizador do Xcode 5 tinha uma visão que listaria todos os logs de falhas. e podemos arrastar soltar os logs de falhas aqui. Mas desde o Xcode 6, eu sei que eles tiraram os dispositivos da organização e têm uma nova janela para o mesmo. Mas não encontro um local onde visualizo os logs de falhas que arrastei e soltei no Xcode 5 depois de subir para o Xcode 6. Alguém sabe a resposta?

Nithin Pai
fonte
3
Perguntei isso meses atrás nos fóruns de desenvolvedores da Apple e nunca recebi uma resposta. Isso é uma perda de funcionalidade útil. Arquive um relatório de bug com a Apple pedindo para recuperar esse recurso.
rmaddy
1
Eu juntei tudo isso durante um fim de semana para resolver a simbolização dos despejos de memória do iOS e do OSX. Ainda é muito difícil, mas deve funcionar. github.com/agentsim/Symbolicator
Tim
4
Xcode, você pode apenas simbolizar logs de falhas dos revisores da Apple como você deveria ... em vez de assumir que temos literalmente o dia todo para descobrir como fazer isso?
William Entriken

Respostas:

119

Ok, eu percebi que você pode fazer isso:

  1. Em Xcode > Window > Devices, selecione um iPhone / iPad / etc conectado superior esquerdo.
  2. Exibir logs do dispositivo
  3. Todos os logs

Você provavelmente tem muitos logs lá e, para facilitar a localização posterior do log importado, basta seguir em frente e excluir todos os logs neste momento ... a menos que eles signifiquem dinheiro para você. Ou, a menos que você saiba o ponto exato em que a falha ocorreu - ela deve estar escrita no arquivo de qualquer maneira ... eu sou preguiçoso, então apago todos os logs antigos (isso levou um tempo).

  1. Basta arrastar e soltar seu arquivo nessa lista. Funcionou para mim.
Jonny
fonte
13
Estou tendo o mesmo problema, mas isso não resolve o problema para mim - os logs que eu arrasto e solto na janela aparecem, mas não simbolizam.
Arkaaito 23/09
9
O truque é que você precisa conectar um dispositivo e selecionar o dispositivo na lista. Eu não acho que é possível sem um dispositivo.
21913 Jonny
59
Para que seu arquivo de falha seja arrastável para essa lista, ele deve ter a extensão .crash.
pjay_
7
O passo que falta para mim foi assim que o arquivo foi descartado eu precisava clique direito do mouse no arquivo e Re-Symbolicate Log
RobCroll
6
Não se esqueça de "Baixar dSYMs" para esse arquivo no Organizer.
123FLO321
259

Escrevendo esta resposta tanto para a comunidade quanto para mim.

Se houver problemas simbolizando um relatório de falha, é possível superá-los da seguinte maneira:

  1. Crie uma pasta separada, copie Foo.appe Foo.app.dSYMdo correspondente .xcarchivepara a pasta. Copie também o .crashrelatório para a pasta

  2. Abra o relatório de falha no TextEdit ou em outro local, vá para a Binary Images:seção e copie o primeiro endereço (por exemplo 0xd7000).

  3. cdpara a pasta Agora você pode executar o seguinte comando:

    xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 0x0033f9bb

Isso simboliza o símbolo no endereço 0x0033f9bb. Certifique-se de escolher o valor correto para a -archopção (pode ser obtido na primeira linha da Binary Images:seção ou descoberto Hardware Model:no relatório de falha e nos arcos suportados pelo aplicativo).

Você também pode copiar os endereços necessários (por exemplo, uma pilha de chamadas de linha) do relatório de falha diretamente para um arquivo de texto (no TextEdit, mantenha pressionada a tecla Option e selecione o bloco de texto necessário, ou copie e recorte), para obter algo assim:

0x000f12fb
0x002726b7
0x0026d415
0x001f933b
0x001f86d3

Agora você pode salvar isso em um arquivo de texto, por exemplo addr.txt, e executar o seguinte comando:

xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 -f addr.txt

Isso dará uma boa simbolização para todos os endereços de uma só vez.

PS

Antes de fazer o acima, vale a pena verificar se tudo está configurado corretamente (como atosfelizmente informará algo para basicamente qualquer endereço fornecido).

Para fazer a verificação, abra o relatório de falha e vá para o final da pilha de chamadas para Thread 0. A primeira linha do final para listar seu aplicativo (geralmente a segunda), por exemplo:

34  Foo                    0x0033f9bb 0xd7000 + 2525627

deve ser a main()chamada. Simbolizar o endereço ( 0x0033f9bbneste caso), como descrito acima, deve confirmar que esse é realmente main()um método ou função aleatória.

Se o endereço não for esse main(), verifique seu endereço de carregamento ( -lopção) e arco ( -archopção).

PPS

Se o procedimento acima não funcionar devido ao código de bit , faça o download do dSYM para sua compilação no iTunes Connect, extraia o binário executável do dSYM (Finder> Mostrar conteúdo do pacote), copie-o no diretório e use-o (por Fooexemplo, argumento para atos, em vez de Foo.app/Foo.

Costa do mar do Tibete
fonte
2
obrigado pelo trabalho de escrever o tutorial do mini xcrun e atualizá-lo com a seção de verificação de integridade. minha sanidade é salvo depois de muita posse e não symbolicate à vista
Anton Tropashko
10
Não se esqueça de validar que o relatório de falha corresponde ao executável e ao dSYM. Você pode verificar isso, combinando o identificador no <> 's na seção Imagem binário com que retornou de seu arquivo executável, executandoxcrun dwarfdump --uuid <path to executable>
Ryan C. Payne
2
É importante observar que apenas os símbolos do seu aplicativo (Foo) serão exibidos. Ele não será exibido para símbolos de bibliotecas / estruturas externas, como Foundation ou libsystem_kernel.dylib.
jlukanta
1
isso é útil, mas ainda não funciona para mim. a parte com a qual estou tendo problemas é que não tenho as informações 0xd7000. minha linha se parece com esta 0x100038328 __mh_execute_header + 99112. Eu li o que __mh_execute_header é, mas como posso obter informações sobre 0x100038328 ??? eu tenho tudo o resto
skinsfan00atg
5
Eu escrevi um script simples do bash que faz a maior parte do trabalho para você. Uso: ./symbolicate.sh mycrash.crash MyApp.app arch64 output.crash Somente ele simboliza o relatório completo de falha e fornece a versão simbolizada dele. gist.github.com/nathan-fiscaletti/…
Nathan F.
186

Você pode consultar este também, eu escrevi o procedimento passo a passo da Re-Simbolização manual de falhas.

Re-simbolização de falhas

PASSO 1

Mova todos os arquivos acima (MyApp.app, MyApp-dSYM.dSYM e MyApp-Crash-log.crash) para uma pasta com um nome conveniente onde quer que você possa usar o Terminal com facilidade.

Para mim, o Desktop é o local mais facilmente acessível;) Então, eu mudei esses três arquivos para uma pasta MyApp no ​​Desktop.

PASSO 2

Agora é a vez do Finder, vá para o caminho a seguir, o que for aplicável à sua versão do XCODE.

Use este comando para encontrar o symbolicatecrasharquivo de script,
find /Applications/Xcode.app -name symbolicatecrash

Xcode 8, Xcode 9, Xcode 11 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

Xcode 7.3 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

XCode 7 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

Xcode 6 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Inferior ao Xcode 6 Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Ou Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources

ETAPA 3

Adicione o diretório do arquivo de script symbolicatecrash encontrado à $PATHvariável env como esta: sudo vim /etc/paths.d/Xcode-symbolicatecrashe cole o diretório do arquivo de script e salve o arquivo. Ao abrir um novo terminal, você pode ligar symbolicatecrashpara qualquer pasta como comandos localizados em /usr/bin.

Ou

Copie o arquivo symbolicatecrash desse local e cole-o no Desktop / MyApp (Aguarde ... Não me siga cegamente, estou colando o arquivo sybolicatecrash na pasta MyApp, que você criou na etapa um do seu local favorito, com três arquivos. )

PASSO 4

Abra Terminal e CD na pasta MyApp.

cd Desktop/MyApp — Press Enter
export DEVELOPER_DIR=$(xcode-select --print-path)

 -  Pressione Enter

./symbolicatecrash -v MyApp-Crash-log.crash MyApp.dSYM

 -  Pressione Enter

É isso aí !! Logs simbolizados estão no seu terminal ... agora o que você está esperando? Agora, simplesmente, descubra o erro e resolva-o;)

Feliz codificação !!!

Mrug
fonte
2
@ EmilVikström: Obrigado pela sugestão, atualizei a resposta.
Mrug 25/05
2
Use export DEVELOPER_DIR =xcode-select --print-path
Parag Bafna 3/15/15
8
Trabalhou um prazer - obrigado. Apenas uma coisa que eu tive que usar export DEVELOPER_DIR = / Applications / XCode.app / Contents / Developer (sem as aspas).
goelectric
1
"export DEVELOPER_DIR = xcode-select --print-path" apenas me diz "-bash: export:` --print-path ': não é um identificador válido
Almo
2
atualizar; Aqui está ; para xcode7, encontre symbolicatecrash aqui; /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash por stackoverflow.com/questions / 32804611 /…
AnneTheAgile 14/10
27

Para mim, o arquivo .crash foi suficiente. Sem os arquivos .dSYM e .app.

Eu executei estes dois comandos no mac onde construí o arquivo e funcionou:

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" 

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash  /yourPath/crash1.crash > /yourPath/crash1_symbolicated.crash
Marek Manduch
fonte
Uau. Não sei como isso funciona sem o arquivo .dsym, mas funciona!
RustyMagnet 20/09/19
4
@rustyMagnet A maneira como funciona é usando dsyms das compilações arquivadas no seu computador.
Andrey Tarantsov 08/08/19
1
Sim, isso funciona apenas para compilações que você arquivou com o Xcode, e não para outras compilações que você possa ter gerado para execuções ad-hoc para as quais deseja simbolizar logs de falhas.
21719 CMash
21

Existe uma maneira mais fácil de usar o Xcode (sem usar ferramentas de linha de comando e procurar endereços um de cada vez)

  1. Pegue qualquer arquivo .xcarchive. Se você tiver um antes, você pode usá-lo. Se você não tiver um, crie um executando o Produto> Arquivar do Xcode.

  2. Clique com o botão direito do mouse no arquivo .xcarchive e selecione 'Mostrar conteúdo do pacote'

  3. Copie o arquivo dsym (da versão do aplicativo que falhou) na pasta dSYMs

  4. Copie o arquivo .app (da versão do aplicativo que falhou) na pasta Produtos> Aplicativos

  5. Edite o Info.plist e edite o CFBundleShortVersionString e CFBundleVersion no dicionário ApplicationProperties. Isso ajudará você a identificar o arquivo posteriormente

  6. Clique duas vezes no arquivo .xcarchive para importá-lo para o Xcode. Deve abrir o Organizer.

  7. Volte para o log de falha (na janela Dispositivos no Xcode)

  8. Arraste o arquivo .crash para lá (se ainda não estiver presente)

  9. Todo o log de falha agora deve ser simbolizado. Caso contrário, clique com o botão direito do mouse e selecione 'Re-simbolizar o log de falhas'

RPM
fonte
1
Sua resposta é correta e simples. Não há necessidade de usar o aplicativo Terminal. A recriação da pasta .xcarchive é muito importante, pois não há arquivo .xcarchive em algum sistema de integração contínua, em vez da bola zip da pasta .app.dSYM. Por coincidência, o que fiz ontem é exatamente o mesmo que você disse.
precisa saber é o seguinte
como deve ser a saída completa?
Noobmcgoobs
Isso simboliza parcialmente meus logs de falha, embora eu tenha pulado as etapas 3-5, pois meu xcarchive é para a versão do aplicativo que travou.
Declan McKenna
1
Ele simboliza apenas seu próprio código, é claro - não o código da biblioteca externa que você pode ter usado.
RPM
7

Siga estas etapas no Xcode 10 para simbolizar um log de falha de uma compilação de aplicativo na mesma máquina:

  1. No Organizer , localize o arquivo em que o aplicativo se baseia.
  2. Clique no botão Download Debug Symbols . Nada aparecerá na sua pasta Downloads, mas tudo bem.
  3. Conecte a máquina de compilação a um dispositivo iOS.
  4. Selecione o dispositivo em Dispositivos e simuladores .
  5. Clique no botão Exibir registros de dispositivos .
  6. Arraste e solte o arquivo de falha no painel esquerdo. O arquivo deve terminar com uma extensão .crash , caso contrário, o arrasto falhará.
  7. Alterne para a guia Todos os logs .
  8. Selecione o arquivo de falha adicionado.
  9. O arquivo deve simbolizar automaticamente; caso contrário, use o item do menu de contexto com o botão direito do mouse em Re-Symbolicate Log .
Ely
fonte
No começo, não achei que isso estivesse adicionando algo a outras postagens, mas os dois primeiros passos, especificamente o 'Download Debug Symbols', parecem ser o que estava faltando. Obrigado.
Christopher King
6

Se você tiver o arquivo .dSYM e o arquivo .crash na mesma subpasta, siga estas etapas:

  1. Observando o backtrace no arquivo .crash, observe o nome da imagem binária na segunda coluna e o endereço na terceira coluna (por exemplo, 0x00000001000effdc no exemplo abaixo).
  2. Logo abaixo do backtrace, na seção "Imagens binárias", observe o nome da imagem, a arquitetura (por exemplo, arm64) e o endereço de carregamento (0x1000e4000 no exemplo abaixo) da imagem binária (por exemplo, TheElements).
  3. Execute o seguinte:

$ atos -arch arm64 -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l 0x1000e4000 0x00000001000effdc -[AtomicElementViewController myTransitionDidStop:finished:context:]

Fonte autorizada: https://developer.apple.com/library/content/technotes/tn2151/_index.html#//apple_ref/doc/uid/DTS40008184-CH1-SYMBOLICATE_WITH_ATOS

Victor Bogdan
fonte
3

Verifique se o nome do seu aplicativo Xcode não contém espaços. Esta foi a razão pela qual não funcionou para mim. Então /Applications/Xcode.appfunciona, enquanto /Applications/Xcode 6.1.1.appnão funciona.

Bouke
fonte
Você tentou? Caso contrário, tente e veja se o seu comentário faz algum sentido.
Bouke
1
Esse não é o mesmo problema que estou falando. O Xcode pode ser renomeado após a instalação, mas antes do primeiro uso. No entanto, o script de simbolização não pode manipular espaços no nome do aplicativo e falhará.
Bouke
1
@ChuckKrutsinger Você já tentou? Como espaços vazios permitirão executar o script, mas o próprio script falhará. O script provavelmente não chama outros scripts com o espaço de escape.
Bouke
1
@ChuckKrutsinger Isso é muito legal, mas se alguém quiser que o Xcode simbolize automaticamente o log de falhas, você precisará da minha resposta no final.
Bouke
1
Gostaria de reiterar que o bouke está correto e que, se houver um espaço no caminho para o aplicativo Xcode, o script que o Xcode usa para re-simbolizar os logs de falha NÃO funcionará. Nada a ver com re-simbolização manual.
Gary Makin
3

Xcode 11.2.1, dezembro de 2019

A Apple fornece log de falha no formato .txt, que não é simbolizado

**

Com o dispositivo conectado

**

  • Faça o download do arquivo ".txt", altere a extensão para ".crash" insira a descrição da imagem aqui
    • Abra dispositivos e simuladores na guia janela no Xcode
    • selecione o dispositivo e selecione os logs do dispositivo
    • arraste e solte o arquivo .crash na janela de log do dispositivo

insira a descrição da imagem aqui

Poderemos ver logs de falhas simbolizados por lá

Consulte o link para obter mais detalhes sobre os logs de simbolização de falhas

Suraj K Thomas
fonte
2

Dos documentos da Apple:

Simbolizando relatórios de falhas com o Xcode O Xcode tentará automaticamente simbolizar todos os relatórios de falhas que encontrar. Tudo o que você precisa fazer para simbolizar é adicionar o relatório de falha ao Xcode Organizer.

  • Conecte um dispositivo iOS ao seu Mac
  • Escolha "Dispositivos" no menu "Janela"
  • Na seção "DISPOSITIVOS" na coluna esquerda, escolha um dispositivo
  • Clique no botão "Exibir registros do dispositivo" na seção "Informações do dispositivo" no painel direito
  • Arraste seu relatório de falha para a coluna esquerda do painel apresentado
  • O Xcode simboliza automaticamente o relatório de falha e exibe os resultados Para simbolizar um relatório de falha, o Xcode precisa localizar o seguinte:

    1. O arquivo binário e dSYM do aplicativo com falha.

    2. Os binários e arquivos dSYM para todas as estruturas personalizadas às quais o aplicativo se vincula. Para estruturas criadas a partir da origem com o aplicativo, seus arquivos dSYM são copiados no arquivo morto ao lado do arquivo dSYM do aplicativo. Para estruturas criadas por terceiros, você precisará solicitar ao autor o arquivo dSYM.

    3. Símbolos para o sistema operacional em que o aplicativo estava sendo executado quando falhou. Esses símbolos contêm informações de depuração para as estruturas incluídas em uma versão específica do sistema operacional (por exemplo, iOS 9.3.3). Os símbolos do SO são específicos da arquitetura - uma versão do iOS para dispositivos de 64 bits não inclui símbolos armv7. O Xcode copia automaticamente os símbolos do SO de cada dispositivo conectado ao seu Mac.

Se algum destes itens estiver ausente, o Xcode pode não ser capaz de simbolizar o relatório de falha ou apenas parcialmente representar o relatório de falha.

Ethan
fonte
2

O processo mais fácil para simbolizar os logs de falha:

  1. preserve o arquivo xcarchive do organizador durante o processo de criação do IPA para uso futuro.
  2. Quando a falha ocorrer, colete os logs de falha do dispositivo afetado. A extensão deve ser .crash. Se o log de falha estiver no formato .ips, apenas renomeie-o para .crash.
  3. Clique duas vezes no xcarchive no caminho armazenado para que ele apareça no organizador (se já não estiver presente).
  4. abra na janela do xcode-> dispositivos e simuladores -> visualize os registros do dispositivo -> todos os registros -> arraste e solte o arquivo .crash.

Aguarde 5 segundos. Bang! as chamadas do aplicativo no rastreamento da pilha serão simbolizadas! Você ainda pode ver muitos símbolos! essas são chamadas de biblioteca e estrutura internas.

Este é o mais fácil, experimentado e testado!

Sanchita
fonte
1

A Apple fornece log de falha no formato .txt, que não é simbolizado

**

Com o dispositivo conectado

**

  • Faça o download do arquivo ".txt", altere a extensão para ".crash" insira a descrição da imagem aqui
    • Abra dispositivos e simuladores na guia janela no Xcode
    • selecione o dispositivo e selecione os logs do dispositivo
    • arraste e solte o arquivo .crash na janela de log do dispositivo

insira a descrição da imagem aqui

Poderemos ver logs de falhas simbolizados por lá

Consulte o link para obter mais detalhes sobre os logs de simbolização de falhas

Suraj K Thomas
fonte