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

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

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 3

4 Teil 1 F9 ist nicht genug Das kann Visual Studio Dieser Vortrag steht zum Download bereit unter 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 5

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

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

8 DebuggerDisplay Dieser Vortrag steht zum Download bereit unter 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 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 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 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 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 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 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 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 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 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 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 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 = Process proc = Process.GetProcessById(pid); int dumpType = (int)0x ; // all options // int dumpType = (int)0x ; // minidump MiniDumpWriteDump(proc.Handle, proc.Id, stream.Handle, dumpType, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); FileStream stream = Process proc = Process.GetProcessById(pid); int dumpType = (int)0x ; // all options // int dumpType = (int)0x ; // 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 20

21 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