Grynet skrev:
I en release strippas .pdb filerna automatiskt ju.
Nej, det stämmer inte. PDB-filer är inget som "strippas" (Det förekommer att man strippar pdb-filer, men det är av ett annat syfte än vad du beskriver). PDB-filer är något man väljer att generera (eller att inte generera), genom att välja "True" (eller "False") för "Generate Debugging Information" från Build-inställningarna för sitt C# projekt.
Det finns några bra artiklar, bland annat av John Robbins, speciellt denna. Sök på MSDN efter fler.
Som sagt är PDB-filer (Program Database) till för att man under debugger ska mappa binärens klasser, variabler, funkioner etc till källkodsfiler. De innehåller alltså ingen kod som körs eller liknande. PDB-filers existens (eller frånvaro) har därför ingen som helst påverkan på prestanda.
Väljer man att generera PDB-filer kommer exe-filen innehålla en sträng som pekar ut path:en till PDB-filen. Det är enda skillnaden på binären. Det finns ingen koppling mellan debug/release konfiguration och huruvida PDB-filer genereras eller inte, däremot är default-värdena olika. Default-inställningen är True för debug-konfiguration och False för release-konfiguration. Man bör dock alltid sätta True även för release-konfiguration.
Skillnader mellan debug och release konfigurationer är alls stor i C# - gå igenom alla projekt inställningar så ser du exakt alla skillnader som finns. De flesta optimeringarna görs av JIT-kompilatorn, dvs inte under genereringen av IL-koden. "Kompilerings-konstanten" (makron i C/C++) DEBUG som definieras i debug konfiguration kan man som programmerare exempelvis använda för att lägga in mer verifieringskod i sina egna program. Annars har det ingen påverkan på prestanda. Däremot spelar det förstås in hur krävande kod som endast kompileras om DEBUG är definierad, dvs anrop till System.Diagnostics.Debug.* och egen kod typ:
[Conditional("DEBUG")]
void DoExtraValidatation(string[] strings) {
// gör saker som är långsamma och/eller som man endast vill ha
// sina debug-versioner
}
eller
#if DEBUG
// gör saker som är långsamma och/eller som man endast vill ha
// sina debug-versioner
#endif
Har man mycket verifieringskod, som ju bara kommer med när DEBUG är definierad, blir det större skillnad mellan debug och release konfigurationerna. Har man ingen verifieringskod blir skillnaden förmodligen inte ens mätbar (eftersom de stora optimeringaran görs när programmet körs, inte när det kompileras från C# till MSIL).
Grynet skrev:
alla breakpoints ignoreras i release builds
Nej, det har du fått om bakfoten. Anledningen till att du inte kan sätta breakpoints är just att du inte har några symboler (PDB-filer). Hur ska debuggern veta var breakpoint-instruktionen ska läggas om du inte har en mappning mellan källkod och binär? Slå på "Generate Debugging Information" så kan du sätta breakpoints även i din release-konfiguration. Mycket användbart.
Grynet skrev:
I en release använder du trace objektet för att leta fel medans du enbart använder debug objektet i prereleaser.
Vet inte riktigt vad du menar med det. Jag använder Debug.*-metoder för all form av intern kontroll av mitt program. Sedan får kunden programmet byggt med release-konfiguration, och då finns Debug.* koden inte med. Däremot aldrig jag inte koden manuellt, utan det sköts beroende på vilken konfiguration man bygger. Antar att det var vad du menade, för du går väl knappast igenom all din kod och ändrar något innan in release?