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( "\r\n", "<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:\System\Desktop\DeployTestSolution\ClassLibrary1\MyClass.cs:line 12
at _Default.Page_Load(Object sender, EventArgs e) in w:\System\Desktop\DeployTestSolution\MyWeb\Default.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:\System\Desktop\DeployTestSolution\MyWeb\Default.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.



Balássy György (MS RD, ASP.NET MVP, MCTS)

Balássy György (MS RD, ASP.NET MVP, MCTS) Villamosmérnök, a BME Automatizálási és Alkalmazott Informatikai Tanszékén webportálok fejlesztését oktatja. 2000 óta foglalkozik a Microsoft .NET platformjával, melynek meghonosításában jelentős szerepet vállalt előadóként, konzulensként és A .NET Framework és programozása című könyv társszerzőjeként. Az MSDN Kompetencia Központon belül a Portál Technológiák Csoport vezetője, szakterülete web alapú rendszerek fejlesztése és üzemeltetése. 2004-ben Magyarországon elsőként kapta meg a Most Valuable Professional címet, majd 2005 óta a Microsoft magyarországi regionális igazgatója. Publikációi a Technet Magazinban, az MSDN Kompetencia Központ honlapján és szakmai blogjában olvashatóak.

2009.09.01. 21:47:52 | Permalink | Hozzászólások: 0 | Tárgyszavak:


  • Run ablak Windows Mobile-on

    Balássy György (MS RD, ASP.NET MVP, MCTS) Nem éppen gyakori kérdés, de azért újra és újra belefut az ember, hogy hogyan lehet Windows Mobile-on egy parancssort, vagy legalább egy Run ablakot előhúzni. Íme egy trükk: tartsuk nyomva az Action gombot és közben tappintsunk sokáig a címsorban az óra helyére. Az Analog/Digital menü helyett ez jelenik meg. Tovább »
  • Kommunikáció ASP.NET és Silverlight között

    Balássy György (MS RD, ASP.NET MVP, MCTS) Mostanában divat azon vitatkozni, hogy az ASP.NET vagy a Silverlight-e a jövő webfejlesztő technológiája. Különösen az utóbbi hívei között vannak olyanok, akik szeretik azt hinni, hogy kis kedvencük minden helyzetben tökéletes választás. Szerintem a két technológiát együtt fogjuk használni a jövőben: amit nem lehet vagy nem célszerű a böngészőben megoldani, ott fogunk a böngésző bővítményhez folyamodni. Ehhez persze nélkülözhetetlen, hogy a két világ tudjon egymással kommunikálni. Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások