Nemrég készítettem egy webalkalmazást, ami egy solutionben volt egy Class Library típusú projekttel. Fordítgatás után feltűnt, hogy Release módban is ott virít a bin mappában az osztálykönyvtár DLL-jéhez tartozó PDB fájl. Vajon kell ez egy production szerverre?
Annyit nagyjából mindenki tud a PDB fájlokról, hogy valami debuggoláshoz használatos izé, meg biztos jó, ha van. Akit jobban érdekel, hogy mi van benne, annak feltétlenül tudom ajánlani John Robbins PDB Files: What Every Developer Must Know című cikkét. Akit annyira nem érdekel (és egyébként annyira talán nem is érdekes), annak itt a lényeg:
- A PDB fájlokat nem szokás nézegetni, majd a Visual Studio kiszedi belőle azt, ami kell neki.
- Lényegében az van a PDB fájlban, hogy a DLL-hez hol van a forráskód és az egyes utasítások azon belül melyik sorban vannak.
- A PDB fájlok nem csereberélhetők az egyes DLL verziók között még akkor sem, ha két fordítás között a DLL forráskódja egy bitnyit sem változott. A DLL-t és a PDB-t egy közös GUID köti össze, ami minden fordításnál változik.
- Ebből következik, hogy ha fontos, amit a PDB tud, akkor azt meg kell őrizni minden egyes buildnél, mert később nem lehet újra előállítani.
A kérdés már csak az, hogy Release konfigurációnál miért keletkezik PDB és hogy production környezetben szükség van-e erre a fájlra, vagy nyugodtan törölhető?
Próbaként alkottam egy Class Library-t, benne az alábbi osztállyal:
public static class MyClass
{
public static void Boom()
{
throw new ApplicationException( "Külső kivétel.",
new IndexOutOfRangeException( "Belső kivétel." ) );
}
}
Majd hozzáadtam a solutionhöz egy Web Site típusú projektet, ahol a default.aspx-en belül meghívtam ezt a metódust így:
protected void Page_Load(object sender, EventArgs e)
{
try
{
MyClass.Boom();
}
catch( Exception ex )
{
this.Response.Write( ex.ToString().Replace( "rn", "<br/>" ) );
}
}
Az érdekelt, hogy mennyire részletes a kimenet. Alapesetben volt PDB fájl a webalkalmazás bin mappájában, kimenetként ezt kaptam:
System.ApplicationException: Külső kivétel. —> System.IndexOutOfRangeException: Belső kivétel.
— End of inner exception stack trace —
at ClassLibrary1.MyClass.Boom() in W:SystemDesktopDeployTestSolutionClassLibrary1MyClass.cs:line 12
at _Default.Page_Load(Object sender, EventArgs e) in w:SystemDesktopDeployTestSolutionMyWebDefault.aspx.cs:line 16
Miután kitöröltem vagy átneveztem a PDB fájlt (a DLL-hez nem nyúltam) már csak ennyi volt a hibaüzenet:
System.ApplicationException: Külső kivétel. —> System.IndexOutOfRangeException: Belső kivétel.
— End of inner exception stack trace —
at ClassLibrary1.MyClass.Boom()
at _Default.Page_Load(Object sender, EventArgs e) in w:SystemDesktopDeployTestSolutionMyWebDefault.aspx.cs:line 16
Tehát a DLL-ről már nem tudjuk, hogy pontosan melyik sorban hibás. Ha erre nincs szükségünk, akkor a Project properties –> Build –> Advanced (legalul eldugva) gombra megjelenő Advanced Build Settings ablakban megkérhetjük a Studiót, hogy kíméljen meg a PDB fájloktól:
Ez egyébként annyit tesz, hogy a project fájlunkba a következőt írja: <DebugType>none</DebugType>
Ha parancssorból fordítunk, akkor ugyanezt a hatást érhetjük el akkor, ha az MSBUILD utasítás végére a /p:DebugType=none kapcsolót illesztjük.
Mi a helyzet a webalkalmazással?
Az nyilvánvaló, hogy a compilation debug=”true” kapcsoló a web.configban erre is vonatkozik, false értéknél már csak ennyi a kimenet (PDB nélkül):
System.ApplicationException: Külső kivétel. —> System.IndexOutOfRangeException: Belső kivétel.
— End of inner exception stack trace —
at ClassLibrary1.MyClass.Boom()
at _Default.Page_Load(Object sender, EventArgs e)
Szinte biztos, hogy nem akarjuk az egész alkalmazást debug módban használni, mégis előfordulhat, hogy szükségünk lenne részletes stack trace-re és sor számokra. Ez esetben marad a parancssori fordítás, ahol a –d kapcsolóval kérhetünk PDB fájlokat (a MyWeb a forráskönyvtár a MyWebCompiled pedig a cél):
aspnet_compiler -v / -p MyWeb -f -d MyWebCompiled
Íme a kimenet a webalkalmazás bin mappájában:

Ezek után már átírhatjuk a debug attribútumot false értékre, a stack trace-ben megmaradnak a részletes információk.