Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Ingo Rammer thinktecture.

Ähnliche Präsentationen


Präsentation zum Thema: "Ingo Rammer thinktecture."—  Präsentation transkript:

1 Ingo Rammer ingo.rammer@thinktecture.com thinktecture

2 Kleine Beratungsfirma für Softwareentwickler Unterstützung, Coaching und Beratung für Software- Architekten und -Entwickler Architektur- und Code-Reviews Prototypentwicklung und Architekturberatung Coaching und Mentoring Anwendungsoptimierung und Troubleshooting http://www.thinktecture.com ingo.rammer@thinktecture.com

3 Debugging von Applikationen mit Visual Studio Erweiterte Breakpoints, Tracepoints,... Makros Debugger-Attribute Visualizer für eigene Typen Visualizer für fremde Typen Neues in Visual Studio 2008 Vorbereitung von Anwendungen für Debugging

4 Teil 1 F9 ist nicht genug Das kann Visual Studio

5 Breakpoints Just My Code (Tools Options Debugging General) CTRL+B, Breakpoint Groups Tracepoints Hitcount Conditions Makros Command Window help alias

6 Ausdrücke in Variablenfenstern (Watch, Locals, Autos) DebuggerDisplay DebuggerProxy DebuggerVisualizer

7 Interaktive Klassenerstellung Aufruf von statischen Methoden Object Workbench Aufruf von Instanzmethoden Immediate Fenster

8 Just in Time Debugger HKLM\Software\Microsoft\Windows NT\CurrenVersion\AeDebug

9 Debugging in den.NET Framework Quellcode http://blogs.msdn.com/sburke/archive/2008/01/16/confi guring-visual-studio-to-debug-net-framework-source- code.aspx Oder: Suche nach debugging.net source code 2008 Grund warum ich es nicht zeige: benötigt Internet- Verbindung, Quellcode ist nicht gecached Multithreaded Debugging

10 public class Invoice { [DebuggerDisplay("Items: {_items.Count} Sum: {Sum}")] private List _items = new List (); public double Sum { get { double sum = 0; foreach (InvoiceItem itm in _items) sum += (itm.Price * itm.Amount); return sum; } public class Invoice { [DebuggerDisplay("Items: {_items.Count} Sum: {Sum}")] private List _items = new List (); public double Sum { get { double sum = 0; foreach (InvoiceItem itm in _items) sum += (itm.Price * itm.Amount); return sum; } [DebuggerDisplay]-Attribut

11 [DebuggerVisualizer] Attribut Klassen müssen [Serializable] sein Visualizer erhält serialisierten Klon Rückmeldung per objectService.ReplaceObject() [DebuggerVisualizer(typeof(MyVisualizer))] [Serializable] public class Invoice { //... } [DebuggerVisualizer(typeof(MyVisualizer))] [Serializable] public class Invoice { //... }

12 Für Applikationsklassen (Visualizer in gleicher Assembly wie Anwendung) Referenz auf Microsoft.VisualStudio.DebuggerVisualizers Ableiten von DialogDebuggerVisualizer protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider) { MyClass dt = (MyClass) objectProvider.GetObject(); Form1 frm = new Form1(); //... show data... windowService.ShowDialog(frm); } protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider) { MyClass dt = (MyClass) objectProvider.GetObject(); Form1 frm = new Form1(); //... show data... windowService.ShowDialog(frm); }

13 Möglichkeit 2: Getrennte Visualizer in Klassenbibliothek Visualizer kann global oder per User installiert werden: Program Files\Microsoft Visual Studio 9\ Common7\Packages\Debugger\Visualizers My Documents\Visual Studio 2008\Visualizers [assembly: System.Diagnostics.DebuggerVisualizer( typeof(InvoiceVisualizer), typeof(VisualizerObjectSource), Target = typeof(Invoice), Description = "Invoice Visualizer")] [assembly: System.Diagnostics.DebuggerVisualizer( typeof(InvoiceVisualizer), typeof(VisualizerObjectSource), Target = typeof(Invoice), Description = "Invoice Visualizer")]

14 Stellvertreter-Klassen im Debugger Werden automatisch statt den ursprünglichen Klassen angezeigt [assembly: DebuggerTypeProxy(typeof(InvoiceProxy), Target = typeof(Invoice))] public class InvoiceProxy: Invoice { private Invoice _val; public InvoiceProxy(Invoice val) { _val = val; }... [assembly: DebuggerTypeProxy(typeof(InvoiceProxy), Target = typeof(Invoice))] public class InvoiceProxy: Invoice { private Invoice _val; public InvoiceProxy(Invoice val) { _val = val; }...

15 Teil 2 Vorbereiten für´s Debuggen

16 Wofür? Zeitersparnis während Entwicklung Unterstützung im Testbetrieb (Friendly Customers) Fehlersuche im Echtbetrieb (Production Debugging) Grundsätzlich Während der Entwicklungszeit bestimmen Sie die notwendige Zeit für späteres Debugging

17 Primärer Einsprungpunkt für späteres Debuggen Drei Grundregeln Auslösen von nicht-essentiellen Exceptions vermeiden (TryParse, File.Exists) Was ist essentiell? Wenn die Methode nicht das macht (oder: machen kann), was der Name nahelegt, dann wird eine Exception geworfen Exceptions werden nur dort gefangen, wo die Applikation etwas mit der Exception machen kann Logging ist kein Grund für re-throws! (Callstack gibts auch später noch) Wo muss gecatcht werden? Threadprozeduren, Finalizer, eventuell Events

18 Kleiner, feiner Debugger Zwei Versionen: MDbg SDK (hier nicht relevant) MDbg Sample (mit Sourcecode) Bietet komplettes Debugger Objektmodell

19 Zu lange Locking-Dauer ist ein Problem für Skalierbarkeit von Applikationen Was kann man im Debugger machen?

20 Speicherabbilder sind die ultimative Unterstützung zur Fehlersuche Zeigen den Status einer Applikation zu einem bestimmten Zeitpunkt Zwei Ausprägungen Minidump: praktisch nur Callstack, wenige KB gross Minidump mit allen Optionen: komplettes Speicherabbild, kann einige 100 MB gross werden

21 DbgEng.DLL (aus Debugging Tools for Windows) Darf in Ihre Programme integriert werden [DllImport("DbgHelp.dll", SetLastError = true)] private static extern bool MiniDumpWriteDump( IntPtr hProcess, int processId, IntPtr fileHandle, int dumpType, IntPtr excepInfo, IntPtr userInfo, IntPtr extInfo); [DllImport("DbgHelp.dll", SetLastError = true)] private static extern bool MiniDumpWriteDump( IntPtr hProcess, int processId, IntPtr fileHandle, int dumpType, IntPtr excepInfo, IntPtr userInfo, IntPtr extInfo); FileStream stream = File.Create(@"C:\test.dmp"); Process proc = Process.GetProcessById(pid); int dumpType = (int)0x00000006; // all options // int dumpType = (int)0x00000000; // minidump MiniDumpWriteDump(proc.Handle, proc.Id, stream.Handle, dumpType, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); FileStream stream = File.Create(@"C:\test.dmp"); Process proc = Process.GetProcessById(pid); int dumpType = (int)0x00000006; // all options // int dumpType = (int)0x00000000; // minidump MiniDumpWriteDump(proc.Handle, proc.Id, stream.Handle, dumpType, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);

22 Debugging von Applikationen mit Visual Studio Erweiterte Breakpoints, Tracepoints, Makros [DebuggerDisplay], [DebuggerVisualizer], [DebuggerProxy] Neues in Visual Studio 2008 Vorbereitung von Anwendungen Exception-Handling MDbg Eigene Debugger mit dem Objektmodell von MDbg Beispiel: Lock-Bearbeitung

23 © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.


Herunterladen ppt "Ingo Rammer thinktecture."

Ähnliche Präsentationen


Google-Anzeigen