A debugger automatikus kiértékelésének szabályozása

Már korábban is volt szerencsénk belefutni olyan szituációba, amikor a Visual Studio debuggere meglepetéseket okozott. Szinte minden debuggerrel kapcsolatos anomáliát ugyanaz a jelenség idézi elő:

Ahhoz, hogy a Watch vagy Locals ablak ki tudja írni a változóid és azok tulajdonságainak értékét, ki kell értékelnie őket. Akkor is, ha a programod ezen a ponton erre nem is számít.

Itt vagyunk tulajdonképpen kényszerhelyzetben: néha szeretnénk debuggolni és néha olyan kódot, ami ezt nem viseli el. Mit tehetünk a debugger általi korai kiértékelések elkerülése érdekében? Szabályozhatjuk, hogy mit és hogyan írjon ki a Visual Studio debuggere!

A megoldást a System.Diagnostics névtér DebuggerBrowsable attribútuma jelenti. Három különböző értékkel lehet vele tulajdonságokat cimkézni: Collapsed, Never, RootHidden. A Collapsed a jól megszokott debuggolási élményt nyújtja: a tulajdonság értékét látjuk. A Never-rel ellátott tulajdonságok nem jelennek meg maguktól a debuggerben, de kézzel megadva őket (például a Watch ablakban) azért láthatóak. A RootHidden hatására maga a tulajdonság nem látszik, de gyermekelemei igen.

Alább egy egyszerű példa látható: a TestClass osztály három tulajdonságát a három különböző attribútum-értékkel láttam el.

public class TestClass
{
    [DebuggerBrowsable( DebuggerBrowsableState.Collapsed )]
    public string[] Collapsed
    {
        get { return new string[] { "ez", "a", "collapsed" }; }
    }

    [DebuggerBrowsable( DebuggerBrowsableState.Never )]
    public string[] Never
    {
        get { return new string[] { "ez", "meg", "a", "collapsed" }; }
    }

    [DebuggerBrowsable( DebuggerBrowsableState.RootHidden )]
    public string[] RootHidden
    {
        get { return new string[] { "ilyen", "a", "roothidden" }; }
    }
}

 

Példányosítok egyet a TestClass-ból:

static void Main( string[] args )
{
    TestClass tc = new TestClass();
    Console.ReadKey();
}

 

Beteszek egy breakpointot és megfigyelem a Locals és Watch ablakokat:

debuggerbrowsable_1 debuggerbrowsable_2

 

A Never-rel ellátott tulajdonság nem látható a Locals ablakban, csak a Watch ablakban explicit megadva értékelődik ki. A Collapsed olyan mintha oda sem írták volna, a RootHidden-es tulajdonság pedig nem látszik, de a gyermekelemei, azaz a gettere által visszaadott string[] igen!



Dávid Zoltán

Dávid Zoltán Mérnök Informatikusként végeztem a BME-n, jelenleg webfejlesztéssel és gépi tanulással foglalkozom.

2008.07.23. 11:31:41 | Permalink | Hozzászólások: 0 | Tárgyszavak: , ,


  • IE9 pinnelés javascriptből

    Dávid Zoltán Krisztián barátom múltkor bemutatta az IE9 pinnelés alapjait. Az ő forráskódja deklaratív HTML volt, a pinnelést a felhasználónak kellett megtennie. Úgy tűnik arra is van lehetőség, hogy ezt a mozdulatot elkerüljük: az IE9 oldalak javascriptből is pinnelhetőek. Eddig két metódust találtam. Tovább »
  • IdentityNotMappedException

    Balássy György (MS RD, ASP.NET MVP, MCTS) Nem először sikerül belefutnom az alábbi kivételbe, szinte mindig valamilyen egyedi telepítő futtatása közben: “System.Security.Principal.IdentityNotMappedException: Nem lehet lefordítani néhány azonosítási hivatkozást, illetve egyet sem.” Na kösz, és ez mit jelent? 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