Rilascio di generazione di file .pdb, perché?


264

Perché Visual Studio 2005 genera i .pdbfile durante la compilazione in versione? Non eseguirò il debug di una build di rilascio, quindi perché vengono generati?


18
Perché generare pdb in realease? Quindi, quando arriva un rapporto di arresto anomalo, sono disponibili informazioni per il debug. L'altro valore è che i clienti possono eseguire il debug quando l'autore originale non lo farà.
Ian Boyd,

@IanBoyd: la seconda frase di quel commento implica che si distribuiscono i PDB. Questo nella stragrande maggioranza dei casi non è auspicabile.
Indispensabile il

3
@Ispettabile O è desiderabile
Ian Boyd il

@IanBoyd: la stragrande maggioranza dei casi non include le distribuzioni del sistema operativo. Inoltre, quei PDB non contengono simboli privati, inclusi per impostazione predefinita, quando si generano PDB.
prevedibile il

@Ispettabile D'altra parte, è auspicabile il rilascio di PBD . Idealmente, sì, tutti scriverebbero codice compilato su IL, in modo da poter ottenere informazioni sui simboli da soli. Ma i compilatori di codice nativo non hanno ancora un modo semplice per supportare il debug sul campo.
Ian Boyd,

Risposte:


416

Perché senza i file PDB, sarebbe impossibile eseguire il debug di una build "Release" con qualcosa di diverso dal debug a livello di indirizzo. Le ottimizzazioni fanno davvero un numero sul tuo codice, rendendo molto difficile trovare il colpevole se qualcosa va storto (diciamo, viene generata un'eccezione). Anche l'impostazione dei punti di interruzione è estremamente difficile, poiché le righe del codice sorgente non possono essere abbinate una a una (o anche nello stesso ordine) del codice assembly generato. I file PDB aiutano te e il debugger, facilitando notevolmente il debug post mortem.

Fai notare che se il tuo software è pronto per il rilascio, a quel punto avresti dovuto eseguire tutto il debug. Anche se questo è certamente vero, ci sono un paio di punti importanti da tenere a mente:

  1. Dovresti anche testare ed eseguire il debug della tua applicazione (prima di rilasciarla) usando la build "Release". Questo perché l'attivazione delle ottimizzazioni (sono disabilitate per impostazione predefinita nella configurazione "Debug") a volte può far apparire bug sottili che altrimenti non verrebbero colti. Quando esegui questo debug, vorrai i simboli PDB.

  2. I clienti segnalano spesso casi limite e bug che affiorano solo in condizioni "ideali". Queste sono cose che sono quasi impossibili da riprodurre in laboratorio perché si basano su una configurazione bizzarra della macchina di quell'utente. Se sono clienti particolarmente utili, segnaleranno l'eccezione generata e ti forniranno una traccia dello stack. Oppure ti permetteranno persino di prendere in prestito la loro macchina per eseguire il debug del software in remoto. In entrambi i casi, ti consigliamo i file PDB per aiutarti.

  3. La creazione di profili dovrebbe sempre essere eseguita su build "Release" con ottimizzazioni abilitate. E ancora una volta, i file PDB sono utili, poiché consentono di mappare le istruzioni di assemblaggio da profilare sul codice sorgente effettivamente scritto.

Non è possibile tornare indietro e generare i file PDB dopo la compilazione. * Se non li crei durante la creazione, hai perso l'opportunità. Non fa male a nulla crearli. Se non vuoi distribuirli, puoi semplicemente ometterli dai tuoi binari. Ma se in seguito decidi di volerli, sei sfortunato. Meglio generarli sempre e archiviarne una copia, nel caso in cui ne abbiate mai bisogno.

Se vuoi davvero spegnerli, è sempre un'opzione. Nella finestra Proprietà del progetto, imposta l'opzione "Informazioni debug" su "nessuna" per qualsiasi configurazione che desideri modificare.

Do atto, tuttavia, che le configurazioni "Debug" e "Stampa" lo fanno con l'uso di default diverse impostazioni per l'emissione di informazioni di debug. Ti consigliamo di mantenere questa impostazione. L'opzione "Informazioni debug" è impostata su "completo" per una build di debug, il che significa che oltre a un file PDB, le informazioni sui simboli di debug sono incorporate nell'assembly. Ottieni anche simboli che supportano funzioni interessanti come modifica e continua. Nella modalità di rilascio, viene selezionata l'opzione "solo pdb" che, come sembra, include solo il file PDB, senza influire sul contenuto dell'assembly. Quindi non è così semplice come la semplice presenza o assenza di file PDB nella tua /bindirectory. Ma supponendo che tu usi l'opzione "solo pdb", il file PDB "

* Come sottolinea Marc Sherman in un commento , purché il codice sorgente non sia cambiato (o sia possibile recuperare il codice originale da un sistema di controllo della versione), è possibile ricostruirlo e generare un file PDB corrispondente. Almeno, di solito. Funziona bene per la maggior parte del tempo, ma non è garantito che il compilatore generi binari identici ogni volta che compili lo stesso codice , quindi potrebbero esserci sottili differenze. Peggio ancora, se nel frattempo hai apportato aggiornamenti alla tua toolchain (come applicare un service pack per Visual Studio), i PDB hanno ancora meno probabilità di corrispondere. Garantire la generazione affidabile di ex postfactoPer i file PDB, è necessario archiviare non solo il codice sorgente nel sistema di controllo della versione, ma anche i file binari dell'intera toolchain di build per garantire che sia possibile ricreare con precisione la configurazione del proprio ambiente di build. Inutile dire che è molto più semplice creare e archiviare semplicemente i file PDB.


19
"Non è possibile generare i file PDB dopo la compilazione." - Se il codice sorgente non è cambiato, è possibile ricostruire per generare un PDB utilizzabile dopo il fatto. Per impostazione predefinita, windbg non carica questo PDB ma è possibile forzare il caricamento specificando l'opzione / i in questo modo .reload /i foo.dll. Ciò caricherà foo.pdb anche se foo.pdb è stato creato dopo aver rilasciato foo.dll.
Marc Sherman,

Ho notato che ogni nuova compilazione ha un hash digest diverso, quindi ci sono lievi variazioni con ogni build anche nello stesso ambiente. Gli indirizzi per i PDB non potrebbero cambiare con varianza, quindi la necessità di mantenere il PDB da quella build? Lo sto solo dando un'idea, dato che non capisco davvero come funzionano i PDB o perché gli hash cambiano tra le build.
thebunnyrules,

1
@the Nella nota a piè di pagina, ho collegato un articolo che spiega che "il compilatore C # di progettazione non produce mai lo stesso binario due volte. Il compilatore C # incorpora un GUID appena generato in ogni assieme, ogni volta che lo si esegue, garantendo così che non ci siano due assiemi sono sempre identici bit per bit ". Questo spiega perché ha un hash diverso e quindi un diverso file PDB. Questo è risolvibile con un editor esadecimale, ma non è facile da usare. E anche al di fuori dell'ambito di questa risposta.
Cody Gray

3
C'è una nuova funzionalità in Roslyn chiamata build deterministiche. "Il flag / deterministic fa sì che il compilatore emetta esattamente lo stesso EXE / DLL, byte per byte, quando ricevono gli stessi input." Ciò significa che un progetto originariamente compilato con questo flag, può essere ricompilato nello stesso binario esatto, purché il codice che stai compilando sia lo stesso. Una spiegazione più lunga può essere trovata nelle build deterministiche di Roslyn
K Smith,

92

PDB può essere generato sia per Releaseche per Debug. Questo è impostato su (in VS2010 ma in VS2005 deve essere simile):

Progetto → Proprietà → Crea → Avanzate → Informazioni di debug

Basta cambiarlo in None.


2
Ma perché dovresti farlo? Se il tuo software è pronto per il rilascio, allora avresti dovuto eseguire tutto il debug a quel punto
m.edmondson,

4
Perché è possibile eseguire il debug dei problemi di produzione. Una volta abbiamo dovuto farlo.
Aliostad,

21
Il vantaggio di dirigere i PDB per il codice di produzione è che .NET utilizzerà questi file quando genera eccezioni. Genera tracce di stack con nomi di file e numeri di riga, che è spesso molto utile!
Steven,

6
@ m.edmondson: Sì, è corretto. Sarai comunque informato su quale sia stata (come FileNotFoundException) l'eccezione generata , ma non sarai in grado di vedere una traccia dello stack. Ciò rende molto difficile stabilire esattamente quale riga di codice ha causato l'eccezione.
Cody Grey

2
@ m.edmondson Per aggiungere se stai cercando uno strumento per eseguire il debug in remoto di uno dei problemi nelle tue scatole di produzione, Windows SDK viene fornito con uno strumento molto famoso chiamato WinDbg che supporta il debug remoto. Dai un'occhiata al link sotto indicato. Spero che questo ti aiuti! msdn.microsoft.com/en-in/library/windows/hardware/…
RBT

8

Senza i file .pdb è praticamente impossibile scorrere il codice di produzione; devi fare affidamento su altri strumenti che possono essere costosi e richiedere molto tempo. Capisco che puoi usare la traccia o windbg per esempio, ma dipende davvero da cosa vuoi ottenere. In alcuni scenari si desidera semplicemente scorrere il codice remoto (senza errori o eccezioni) utilizzando i dati di produzione per osservare comportamenti particolari, ed è qui che i file .pdb sono utili. Senza di loro è impossibile eseguire il debugger su quel codice.


7

Perché sei così sicuro di non eseguire il debug delle build di rilascio? A volte (si spera raramente, ma succede), potresti ricevere da un cliente un rapporto sui difetti che non è riproducibile nella versione di debug per qualche motivo (tempistiche diverse, comportamenti diversi o altro). Se quel problema sembra essere riproducibile nella build di rilascio, sarai felice di avere il pdb corrispondente.


5
@ m.edmondson Ottieni l'accesso al computer remoto utilizzando RDP, Webex, ecc. e installa windbg lì. Imposta il tuo percorso simboli e bam, sei d'oro!
Marc Sherman,

Un collegamento a una guida più dettagliata sarebbe stato più utile. Questo how-to su una riga potrebbe condurre le persone (come me) sulla strada sbagliata. La maggior parte degli sviluppatori .NET non saprà nulla di Windbg, ad esempio.
nuzzolilo,

1
@ m.edmondson - Alcune edizioni di Visual Studio hanno la possibilità di eseguire il debug remoto. Dal menu di debug si "collega al processo" sul computer remoto.
Matteo,

È una buona idea eseguire il debug remoto di un'istanza dell'applicazione di produzione? Non interromperà l'esecuzione parallela dei thread e li costringerà a correre in seriale durante il debug?
Kaveh Hadjari,

4

Inoltre, è possibile utilizzare i dump di arresto anomalo per eseguire il debug del software. Il cliente te lo invia e quindi puoi usarlo per identificare la versione esatta del tuo sorgente - e Visual Studio tirerà anche il giusto set di simboli di debug (e sorgente se impostato correttamente) usando il dump di crash. Consulta la documentazione di Microsoft su Symbol Stores .


2

Il file .PDB è il nome breve di "Database di programma". Contiene le informazioni sul punto di debug per il debugger e le risorse utilizzate o di riferimento. Viene generato quando costruiamo come modalità di debug. Permette all'applicazione di eseguire il debug in fase di esecuzione.

La dimensione è l'aumento del file .PDB in modalità debug. Viene utilizzato quando stiamo testando la nostra applicazione.

Buon articolo di file pdb.

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


1
"Non è necessario questo file quando si rilascia o si distribuisce" tranne quando si verifica un arresto anomalo in quella versione rilasciata e il rapporto di arresto anomalo che si ottiene da essi non contiene una traccia di stack utilizzabile ... quindi si desidera includerlo dopo tutti.
Nyerguds,

Non vero. Senza i file .pdb otterrai stacktrace completo, ma senza i nomi dei file di origine. Puoi recuperarlo internamente dopo aver ricevuto il rapporto sugli arresti anomali. Se ti preoccupi dei tuoi diritti intellettuali e delle fonti offuscate, devi salvare i file .pdb ma non per distribuirli.
TOP KEK

1

In una soluzione multiprogetto, di solito si desidera avere una configurazione che non generi affatto file PDB o XML. Invece di modificare la Debug Infoproprietà di ogni progetto in none, ho pensato che sarebbe più opportuno aggiungere un evento post-build che funzioni solo in una configurazione specifica.

Sfortunatamente, Visual Studio non consente di specificare diversi eventi post-build per diverse configurazioni. Quindi ho deciso di farlo manualmente, modificando il csprojfile del progetto di avvio e aggiungendo quanto segue (anziché qualsiasi PostBuildEventtag esistente ):

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

Sfortunatamente, questo renderà vuota la casella di testo dell'evento post build e inserendo qualsiasi cosa in essa può avere risultati imprevedibili.


4
Questo eliminerà TUTTI i *.xmlfile, fai attenzione.
Mariusz Jamro

0

I simboli di debug ( .pdb) e i file doc XML ( .xml) rappresentano una grande percentuale della dimensione totale e non dovrebbero far parte del pacchetto di distribuzione normale. Ma dovrebbe essere possibile accedervi nel caso in cui siano necessari.

Un possibile approccio: al termine del processo di compilazione di TFS, spostali in un artefatto separato.


-1

In realtà senza file PDB e informazioni simboliche non sarebbe possibile creare un rapporto sugli arresti anomali di successo (file di dump della memoria) e Microsoft non avrebbe il quadro completo della causa del problema.

E così avere PDB migliora la segnalazione degli arresti anomali.


Ma cosa mancherà esattamente senza i file .pdb?
TOP KEK

Non è possibile generare i file PDB dopo la compilazione. Quindi ogni versione del software major.minor [.build [.revision]] avrebbe dovuto essere salvata su Microsoft per capire correttamente cosa è successo, ma non è tutto.
prosti

Non è garantito che il compilatore generi binari identici ogni volta che compili lo stesso codice.
prosti

La domanda era: cosa mancerà nei rapporti sugli arresti anomali e come sarà influenzato il rapporto sugli arresti anomali. I file pdb .NET contengono solo nomi di variabili private e nomi di file di origine. Tutto il resto (nomi dei metodi, firme ecc.) Sarà inserito nello stacktrace dalle informazioni sui metadati.
TOP KEK

Nessun file PDB contiene anche dati non privati: github.com/microsoft/microsoft-pdb .
prosti
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.