Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Advanced Debugging F9 ist nicht genug Ingo Rammer

Ähnliche Präsentationen


Präsentation zum Thema: "Advanced Debugging F9 ist nicht genug Ingo Rammer"—  Präsentation transkript:

1 Advanced Debugging F9 ist nicht genug Ingo Rammer ingo.rammer@thinktecture.com

2 Ingo Rammer und 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 Agenda Debugging von Applikationen mit Visual Studio –Erweiterte Breakpoints, Tracepoints,... –Makros –Debugger-Attribute –Visualizer für eigene Typen –Visualizer für fremde Typen Vorbereitung von Anwendungen für Debugging –Exception-Handling –MDbg –Eigene Debugger mit dem Objektmodell von MDbg –Lock-Bearbeitung –Automatische Erstellung von Memory-Dumps Heute Nachmittag: Production Debugging (was mach ich bloss mit dem Memory-Dump?) Dieser Vortrag steht zum Download bereit unter www.prioconference.de 3

4 Teil 1 F9 ist nicht genug Das kann Visual Studio Dieser Vortrag steht zum Download bereit unter www.prioconference.de 4

5 Erweiterte Breakpoints Breakpoints –Just My Code (Tools Options Debugging General) –CTRL+B, Breakpoint Groups Tracepoints Hitcount Conditions Makros Command Window –help –alias Dieser Vortrag steht zum Download bereit unter www.prioconference.de 5

6 Interaktive Tests Interaktive Klassenerstellung –Aufruf von statischen Methoden Object Workbench –Aufruf von Instanzmethoden Immediate Fenster Dieser Vortrag steht zum Download bereit unter www.prioconference.de 6

7 Just in Time Debugger –HKLM\Software\Microsoft\Windows NT\CurrenVersion\AeDebug Dieser Vortrag steht zum Download bereit unter www.prioconference.de 7

8 DebuggerDisplay Dieser Vortrag steht zum Download bereit unter www.prioconference.de 8 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

9 DebuggerVisualizer [DebuggerVisualizer] Attribut Klassen müssen [Serializable] sein –Visualizer erhält serialisierten Klon –Rückmeldung per objectService.ReplaceObject() Dieser Vortrag steht zum Download bereit unter www.prioconference.de 9 [DebuggerVisualizer(typeof(MyVisualizer))] [Serializable] public class Invoice { //... } [DebuggerVisualizer(typeof(MyVisualizer))] [Serializable] public class Invoice { //... }

10 Debugger Visualizer Für Applikationsklassen (Visualizer in gleicher Assembly wie Anwendung) –Referenz auf Microsoft.VisualStudio.DebuggerVisualizers –Ableiten von DialogDebuggerVisualizer Dieser Vortrag steht zum Download bereit unter www.prioconference.de 10 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); }

11 Debugger Visualizer Möglichkeit 2: Getrennte Visualizer in Klassenbibliothek Visualizer kann global oder per User installiert werden: –Program Files\Microsoft Visual Studio 8\Common7\Packages\Debugger\Visualizers –My Documents\Visual Studio 2005\Visualizers Dieser Vortrag steht zum Download bereit unter www.prioconference.de 11 [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")]

12 Obskures: Debugger Proxy Stellvertreter-Klassen im Debugger Werden automatisch statt den ursprünglichen Klassen angezeigt Dieser Vortrag steht zum Download bereit unter www.prioconference.de 12 [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; }...

13 Teil 2 Vorbereiten für´s Debuggen Dieser Vortrag steht zum Download bereit unter www.prioconference.de 13

14 Vorbereitungen? 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 Dieser Vortrag steht zum Download bereit unter www.prioconference.de 14

15 Exceptions 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 Dieser Vortrag steht zum Download bereit unter www.prioconference.de 15

16 MDbg Kleiner, feiner Debugger Zwei Versionen: –MDbg SDK (hier nicht relevant) –MDbg Sample (mit Sourcecode) Bietet komplettes Debugger Objektmodell Dieser Vortrag steht zum Download bereit unter www.prioconference.de 16

17 Beispiel: Locks Zu lange Locking-Dauer ist ein Problem für Skalierbarkeit von Applikationen Was kann man im Debugger machen? Dieser Vortrag steht zum Download bereit unter www.prioconference.de 17

18 MemoryDumps – Ultimative Fehlersuche 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 Dieser Vortrag steht zum Download bereit unter www.prioconference.de 18

19 Programmgesteuerte Dump-Erstellung DbgEng.DLL (aus Debugging Tools for Windows) Darf in Ihre Programme integriert werden Dieser Vortrag steht zum Download bereit unter www.prioconference.de 19 [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);

20 Summary Debugging von Applikationen mit Visual Studio –Erweiterte Breakpoints, Tracepoints, Makros –[DebuggerDisplay], [DebuggerVisualizer], [DebuggerProxy] Vorbereitung von Anwendungen –Exception-Handling –MDbg –Eigene Debugger mit dem Objektmodell von MDbg Beispiel: Lock-Bearbeitung –Automatische Erstellung von Memory-Dumps Heute Nachmittag: Production Debugging (was mach ich bloss mit dem Memory-Dump?) Dieser Vortrag steht zum Download bereit unter www.prioconference.de 20

21 http://www.thinktecture.com/ ingo.rammer@thinktecture.com http://blogs.thinktecture.com/ingo/ In-depth support and consulting for software architects and developers {}


Herunterladen ppt "Advanced Debugging F9 ist nicht genug Ingo Rammer"

Ähnliche Präsentationen


Google-Anzeigen