Libere a geração de arquivos .pdb, por quê?

264

Por que o Visual Studio 2005 gera os .pdbarquivos ao compilar na versão? Não deparei uma versão compilada, então por que eles são gerados?

m.edmondson
fonte
18
Por que gerar pdb no realease? Portanto, quando um relatório de falha chega, você tem informações para depurá-lo. O outro valor é que os clientes podem depurá-lo quando o autor original não.
12262 Ian Boyd
@IanBoyd: A segunda frase desse comentário implica que você implanta os PDBs. Isso não é desejável na grande maioria dos casos.
Inspectable
3
@IInspectable Or é desejável #
Ian Boyd
@IanBoyd: A grande maioria dos casos não inclui implantações de SO. Além disso, esses PDBs não contêm símbolos particulares, que são incluídos por padrão quando você gera PDBs.
imprevisível
@IInspectable Por outro lado, é desejável liberar PBDs . Idealmente, sim, todos escreveriam código compilado para IL, para que possamos obter informações de símbolos. Mas os compiladores de código nativo ainda não têm uma maneira fácil de oferecer suporte à depuração no campo.
Ian Boyd

Respostas:

416

Porque sem os arquivos PDB, seria impossível depurar uma compilação "Release" por algo que não seja a depuração no nível de endereço. As otimizações realmente fazem um número no seu código, tornando muito difícil encontrar o culpado se algo der errado (por exemplo, uma exceção é lançada). Mesmo definir pontos de interrupção é extremamente difícil, porque as linhas do código-fonte não podem ser comparadas individualmente com (ou mesmo na mesma ordem que) o código de montagem gerado. Os arquivos PDB ajudam você e o depurador, facilitando significativamente a depuração post-mortem.

Você defende que, se o seu software estiver pronto para o lançamento, você deverá ter feito toda a sua depuração até então. Embora isso certamente seja verdade, há alguns pontos importantes a serem lembrados:

  1. Você também deve testar e depurar seu aplicativo (antes de liberá-lo) usando a compilação "Release". Isso ocorre porque ativar as otimizações (elas são desativadas por padrão na configuração "Debug") às vezes pode causar erros sutis que você não conseguiria capturar. Ao fazer essa depuração, você desejará os símbolos do PDB.

  2. Os clientes frequentemente relatam casos extremos e erros que surgem apenas em condições "ideais". São coisas quase impossíveis de reproduzir no laboratório, porque elas dependem de alguma configuração esquisita da máquina desse usuário. Se forem clientes particularmente úteis, eles reportarão a exceção lançada e fornecerão um rastreamento de pilha. Ou eles ainda permitem que você empreste sua máquina para depurar seu software remotamente. Em qualquer um desses casos, você desejará que os arquivos PDB o ajudem.

  3. A criação de perfil sempre deve ser feita nas compilações "Release" com as otimizações ativadas. E mais uma vez, os arquivos PDB são úteis, pois permitem que as instruções de montagem que estão sendo perfiladas sejam mapeadas de volta ao código-fonte que você realmente escreveu.

Você não pode voltar e gerar os arquivos PDB após a compilação. * Se você não criá-los durante a compilação, perdeu a oportunidade. Não dói nada para criá-los. Se você não deseja distribuí-los, pode simplesmente omiti-los dos seus binários. Mas se você decidir mais tarde que deseja, não terá sorte. Melhor sempre gerá-los e arquivar uma cópia, caso você precise deles.

Se você realmente deseja desativá-los, é sempre uma opção. Na janela Propriedades do seu projeto, defina a opção "Informações de depuração" como "nenhuma" para qualquer configuração que você queira alterar.

Observe, no entanto, que as configurações de "depuração" e "Lançamento" fazer pelo uso padrão configurações diferentes para a emissão de informações de depuração. Você deseja manter essa configuração. A opção "Informações de depuração" está definida como "cheia" para uma compilação de depuração, o que significa que, além de um arquivo PDB, as informações do símbolo de depuração são incorporadas ao assembly. Você também recebe símbolos que suportam recursos interessantes, como editar e continuar. No modo Release, a opção "pdb-only" está selecionada, o que, como parece, inclui apenas o arquivo PDB, sem afetar o conteúdo do assembly. Portanto, não é tão simples quanto a mera presença ou ausência de arquivos PDB no seu /bindiretório. Mas, supondo que você use a opção "pdb-only", o arquivo PDB '

* Como Marc Sherman aponta em um comentário , desde que seu código-fonte não tenha sido alterado (ou você pode recuperar o código original de um sistema de controle de versão), você pode reconstruí-lo e gerar um arquivo PDB correspondente. Pelo menos, geralmente. Isso funciona bem na maioria das vezes, mas não é garantido que o compilador gere binários idênticos sempre que você compilar o mesmo código , portanto, pode haver diferenças sutis. Pior, se você fez alguma atualização no seu conjunto de ferramentas nesse meio tempo (como a aplicação de um service pack para o Visual Studio), é mais provável que os PDBs correspondam. Para garantir a geração confiável de ex postfactoArquivos PDB, você precisaria arquivar não apenas o código-fonte em seu sistema de controle de versão, mas também os binários de toda a cadeia de ferramentas de construção para garantir que você pudesse recriar com precisão a configuração do seu ambiente de construção. Escusado será dizer que é muito mais fácil simplesmente criar e arquivar os arquivos PDB.

Cody Gray
fonte
19
"Você não pode gerar os arquivos PDB após a compilação." - Se o seu código-fonte não mudou, você pode reconstruir para gerar um PDB utilizável após o fato. Por padrão, o windbg não carrega esse PDB, mas você pode forçá-lo a carregar especificando a opção / i como esta .reload /i foo.dll. Isso carregará o foo.pdb, mesmo que o foo.pdb tenha sido criado após o lançamento do foo.dll.
Marc Sherman
Percebi que cada nova compilação tem um resumo de hash diferente, portanto, há pequenas variações em cada compilação, mesmo no mesmo ambiente. Os endereços dos PDBs não podem variar com a variação, daí a necessidade de manter o PDB dessa compilação? Apenas colocando isso como uma ideia, pois eu realmente não entendo como os PDBs funcionam ou por que os hashes mudam entre as compilações.
precisa saber é o seguinte
1
@ the Na nota de rodapé, vinculei a um artigo explicando que "o compilador C # por design nunca produz o mesmo binário duas vezes. O compilador C # incorpora um GUID recém-gerado em cada assembly, toda vez que você o executa, garantindo assim que não haja dois assemblies são sempre idênticos bit a bit ". Isso explica por que ele tem um hash diferente e, portanto, um arquivo PDB diferente. Isso pode ser corrigido com um editor hexadecimal, mas não é fácil de usar. E também fora do escopo desta resposta.
Cody Gray
3
Há um novo recurso em Roslyn chamado construções determinísticas. "O sinalizador / deterministic faz com que o compilador emita exatamente o mesmo EXE / DLL, byte por byte, quando recebem as mesmas entradas." O que isto significa é que um projeto compilado originalmente com esse sinalizador pode ser recompilado exatamente no mesmo binário, desde que o código que você está compilando seja o mesmo. A explicação mais longa pode ser encontrada em determinística constrói em Roslyn
K Smith
92

O PDB pode ser gerado Releasetanto quanto para Debug. Isso é definido em (no VS2010, mas no VS2005 deve ser semelhante):

Projeto → Propriedades → Compilar → Avançado → Informações sobre depuração

Apenas mude para None.

Aliostad
fonte
2
Mas por que você faria isso? Se o seu software está pronto para lançamento, então você deveria ter feito toda a sua depuração, então
m.edmondson
4
Porque você pode depurar os problemas de produção. Uma vez tivemos que fazer isso.
Aliostad 28/03
21
A vantagem de liderar PDBs para código de produção é que o .NET usará esses arquivos ao lançar exceções. Ele gera rastreamentos de pilha com nomes de arquivos e números de linha, o que geralmente é muito útil!
28511 Steven
6
@ m.edmondson: Sim, está correto. Você ainda será informado como foi a exceção lançada (como FileNotFoundException), mas não poderá ver um rastreamento de pilha. Isso torna muito difícil definir exatamente qual linha de código causou a exceção.
Cody Gray
2
@ m.edmondson Apenas para adicionar se você estiver procurando por uma ferramenta para depurar remotamente um dos problemas em suas caixas de produção, o Windows SDK vem com uma ferramenta muito famosa chamada WinDbg, que suporta depuração remota. Por favor, dê uma olhada no link abaixo mencionado. Espero que isto ajude! msdn.microsoft.com/pt-br/library/windows/hardware/…
RBT
8

Sem os arquivos .pdb, é praticamente impossível passar pelo código de produção; você precisa confiar em outras ferramentas que podem ser caras e demoradas. Entendo que você pode usar rastreamento ou windbg, por exemplo, mas isso realmente depende do que você deseja alcançar. Em certos cenários, você apenas deseja percorrer o código remoto (sem erros ou exceções) usando os dados de produção para observar um comportamento específico, e é aí que os arquivos .pdb são úteis. Sem eles, executar o depurador nesse código é impossível.

user1714880
fonte
7

Por que você tem tanta certeza de que não irá depurar as versões de lançamento? Às vezes (espero que raramente aconteça), você pode obter um relatório de defeito de um cliente que não é reproduzível na versão de depuração por algum motivo (horários diferentes, comportamento pequeno e diferente ou o que for). Se esse problema parecer reproduzível na versão, você ficará feliz em ter o pdb correspondente.

jdehaan
fonte
5
@ m.edmondson Obtenha acesso à máquina remota usando RDP, Webex, etc. e instale o windbg lá. Configure seu caminho de símbolos e bam, você é de ouro!
Marc Sherman
Um link para um guia mais detalhado teria sido mais útil. Este tutorial de uma linha pode levar as pessoas (como eu) ao caminho errado. A maioria dos desenvolvedores .NET não sabe nada sobre o Windbg, por exemplo.
Nuzzolilo 12/09
1
@ m.edmondson - Algumas edições do Visual Studio têm a capacidade de executar depuração remota. No menu de depuração, você "anexa ao processo" na máquina remota.
Matthew
É uma boa idéia depurar remotamente uma instância de aplicativo de produção? Não interromperá a execução paralela de threads e forçará a execução em série durante a depuração?
Kaveh Hadjari
4

Além disso, você pode utilizar despejos de memória para depurar seu software. O cliente envia para você e, em seguida, você pode usá-lo para identificar a versão exata da sua fonte - e o Visual Studio puxa o conjunto certo de símbolos de depuração (e a fonte, se você estiver configurado corretamente) usando o despejo de memória. Consulte a documentação da Microsoft em Symbol Stores .

rlranft
fonte
2

Arquivo .PDB é o nome abreviado de "Banco de Dados do Programa". Ele contém as informações sobre o ponto de depuração do depurador e os recursos usados ​​ou de referência. É gerado quando construímos como modo de depuração. Sua aplicação permite depurar em tempo de execução.

O tamanho é o aumento do arquivo .PDB no modo de depuração. É usado quando estamos testando nosso aplicativo.

Bom artigo do arquivo pdb.

http://www.codeproject.com/Articles/37456/How-To-Inspect-the-Content-of-a-Program-Database-P

Ajay2707
fonte
1
"Não há necessidade deste arquivo ao liberar ou implantar", exceto quando alguém experimenta uma falha nessa versão lançada, e o relatório de falha que você obtém deles não contém um rastreamento de pilha utilizável ... então você desejará incluí-lo depois tudo.
Nyerguds
Não é verdade. Sem os arquivos .pdb, você obterá o rastreamento completo da pilha, mas sem os nomes dos arquivos de origem. Você pode recuperá-lo internamente após receber o relatório de falha. Se você se preocupa com seus direitos intelectuais e ofusca fontes, precisa salvar arquivos .pdb, mas não para implantá-los.
TOP KEK
1

Em uma solução de vários projetos, geralmente você deseja ter uma configuração que não gera nenhum arquivo PDB ou XML. Em vez de alterar a Debug Infopropriedade de cada projeto none, pensei que seria mais conveniente adicionar um evento pós-compilação que funcionasse apenas em uma configuração específica.

Infelizmente, o Visual Studio não permite que você especifique diferentes eventos pós-compilação para diferentes configurações. Então, decidi fazer isso manualmente, editando o csprojarquivo do projeto de inicialização e adicionando o seguinte (em vez de qualquer PostBuildEventtag existente ):

  <PropertyGroup Condition="'$(Configuration)' == 'Publish'">
    <PostBuildEvent>
        del *.pdb
        del *.xml
    </PostBuildEvent>
  </PropertyGroup>

Infelizmente, isso deixará a caixa de texto do evento pós-compilação em branco e colocar qualquer coisa nela poderá ter resultados imprevisíveis.

GregRos
fonte
4
Isso excluirá TODOS os *.xmlarquivos, tenha cuidado com isso.
Mariusz Jamro 03/04
0

Os símbolos de depuração ( .pdb) e os arquivos XML doc ( .xml) representam uma grande porcentagem do tamanho total e não devem fazer parte do pacote de implantação regular. Mas deve ser possível acessá-los caso sejam necessários.

Uma abordagem possível: no final do processo de construção do TFS, mova-os para um artefato separado.

Mark Johanes
fonte
-1

Na verdade, sem os arquivos PDB e as informações simbólicas existentes, seria impossível criar um relatório de falha bem-sucedido (arquivos de despejo de memória) e a Microsoft não teria uma imagem completa do que causou o problema.

E assim, ter o PDB melhora os relatórios de falhas.

prosti
fonte
Mas o que exatamente estará faltando sem os arquivos .pdb?
TOP KEK
Você não pode gerar os arquivos PDB após a compilação. Portanto, todas as versões do software major.minor [.build [.revision]] deveriam ter sido salvas na Microsoft para entender adequadamente o que aconteceu, mas isso não é tudo.
Prosti
Não é garantido que o compilador gere binários idênticos sempre que você compilar o mesmo código.
Prosti
A questão era o que falta nos relatórios de falhas e como os relatórios de falhas serão afetados. Os arquivos pdb do .NET contêm apenas nomes de variáveis ​​particulares e nomes de arquivos de origem. Todo o resto (nomes de métodos, assinaturas etc.) estará no stacktrace a partir das informações de metadados.
TOP KEK
Nenhum arquivo PDB também contém dados não particulares: github.com/microsoft/microsoft-pdb .
Prosti