PDB fájlok a webszerveren

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:

Advanced build settings ablak

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:

aspnet_compiler-d_bin

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.

Technorati-címkék: ,,,,

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s