Menu Home

Resolvendo o erro “virtual filesystem overlay file all-product-headers.yaml not found”

Nos últimos dias, eu vi um número crescente de pessoas enfrentando um problema semelhante ao tentar usar o lldb durante a execução da sua aplicação.

error: virtual filesystem overlay file '/Users/salla/Library/Developer/Xcode/DerivedData/XPTO-eevwsdjquyrbxhbnnxoqlnmyvpax/Build/Intermediates.noindex/ArchiveIntermediates/XPTO/IntermediateBuildFilesPath/XPTO.build/Release-iphonesimulator/XYPTO.build/all-product-headers.yaml' not found

error: couldn't IRGen expression. Please check the above error messages for possible root causes.

Esse erro pode ser bem incômodo, pois impede que o desenvolvedor utilize os recursos do lldb como po para verificar valores ou condições durante o tempo de execução.

A causa do problema

Há um problema conhecido da comunidade de Swift, em como o compilador gera alguns artefatos, usados pelo LLDB para fazer o Symbolication durante o debug.

Os DWARFs gerados contém informações armazenadas em paths absolutos, ou seja, que ficam atrelados a caminhos fixos da máquina de quem os gerou.

Uma vez que outro desenvolvedor pega esses DWARFs, o path absoluto, que parte geralmente da pasta $HOME do desenvolvedor gerador, não existem na sua máquina, e o LLDB emite um erro dizendo que não encontrou o caminho especificado no DWARF.

Por se tratar do compilador, não há uma solução fácil aqui.

Para piorar a situação, a ferramenta de symbolication busca em toda máquina pelos DSYMs, por meio do SpotLight, ferramenta da Apple que indexa os arquivos da máquina, a fim de prover buscas mais rápidas e assertivas.

A única solução possível aqui é remover os causadores do problema na sua máquina: os DSYMs.

Como corrigir

Primeiro, precisamos identificar qual dsym está causando o problema.

Para isso, vamos pegar os UUIDs das imagens que estão carregadas durante a execução do app.

Execute o app, e quando ele estiver rodando, coloque um breakpoint, e quando a execução parar no breakpoint, execute o comando abaixo no lldb:

image list

O LLDB irá retornar uma lista com todas as imagens e seus UUIDs, como mostrado na imagem abaixo:

#praCegoVer: a imagem mostra o comando image list após sua execução, com a lista de todas as imagens carregadas pelo app.

Pegue o UUID da imagem que está causando o erro. Por exemplo, no erro abaixo, vemos que o causador do erro é o módulo XYPTO:

error: virtual filesystem overlay file '/Users/salla/Library/Developer/Xcode/DerivedData/XPTO-eevwsdjquyrbxhbnnxoqlnmyvpax/Build/Intermediates.noindex/ArchiveIntermediates/XPTO/IntermediateBuildFilesPath/XPTO.build/Release-iphonesimulator/XYPTO.build/all-product-headers.yaml' not found

Pesquisando pelo módulo na lista de imagens, encontramos o seguinte UUID:

#praCegoVer: a imagem exibe um UUID grifado, com a descrição na sequência, mostrando que o UUID pertence ao framework XYPTO.

Em seguida, vamos executar o comando para buscar o dsym responsável pelo erro e o apagar, executando o comando abaixo:

mdfind -0 "com_apple_xcode_dsym_uuids == UUID-DA-IMAGEM-AQUI" | xargs -0 rm -rf --

No nosso exemplo, executaremos o comando:

mdfind -0 "com_apple_xcode_dsym_uuids == 664A127D-C264-3415-8515-E0DB99B606C8" | xargs -0 rm -rf --

Em seguida, vamos apagar toda a pasta DerivedData. É importante apagar a pasta toda, pois podem haver referências de outras compilações dentro da pasta.

Se o seu DerivedData está na localização padrão, execute o comando abaixo. Caso não esteja, busque pela pasta e a apague manualmente.

rm -rf $HOME/Library/Developer/Xcode/DerivedData

Por fim, basta compilar e rodar novamente sua aplicação, e os comandos do LLDB como po estarão disponíveis e funcionando normalmente.

Categories: Quick Tips

Tagged as:

André Salla