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:
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:
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.