# Tutorial Profiling and Debugging ASE WS 2022/23 In diesem Tutorial werden wir: * einige Debugging-Strategien besprechen * ein paar Debugger und hilfreiche Werkzeuge kennenlernen * Web-Anwendungen mit requestly prüfen **Achtung:** Dieses Dokument unterstützt lediglich die Übung und ist keine vollständige Anleitung ## Setup Wir brauchen heute für die Beispiele eine simple Linux-Shell und ein paar Linux-Programme. Dafür kann man sich auch wie beim letzten Mal als Nutzer `root` auf einem 'disposable root server' [via segfault.net](https://blog.thc.org/disposable-root-servers) einloggen. ssh root@segfault.net # Password is 'segfault' **Achtung:** Der Server ist nicht sicher - keine vertraulichen Infos/Passwörter dort eintippen Oder: ich richte einen Account auf unserem Projektserver ein (bitte melden) Alternativ kann man die Übungen auch in einer IDE der Wahl prinzipiell nachvollziehen. ## Arten von Bugs (siehe https://en.wikipedia.org/wiki/Software_bug#Types) * Arithmetic * Control Flow * Interfacing * Concurrency * Resources * Syntax * Teamwork / Coordination Weitere?! ## Debugging-Fähigkeiten - systematischer Prozess - Debugging-Strategien - Heuristiken und Muster für häufige Bugs - Werkzeuge ## Debugging-Strategien * Selektives Logging (print, console.log / console.table) * schrittweises Debugging (IDE) * Unit-Tests * Tracing / Log-Analyse * Rubber Ducking * Divide and Conquer Zur Frage: brauche ich einen Debugger?: * https://lemire.me/blog/2016/06/21/i-do-not-use-a-debugger/ * https://buttondown.email/geoffreylitt/archive/starting-this-newsletter-print-debugging-byoc/ ## Debugging-Werkzeuge Die folgenden Werkzeuge sind die Standard-Werkzeuge. Oft existieren auch bessere, neuere Alternativen * C: [gdb](https://www.tutorialspoint.com/gnu_debugger/index.htm) * Python: pdb * JavaScript/Node.js: ["--inspect"](https://nodejs.org/en/docs/guides/debugging-getting-started/) + externer Debugger (IDE, Developer Tools) * System calls unter Linux: `strace` ### Aufgabe C++ * lade die ZIP-Datei aus GRIPS herunter und entpackt sie * führe die Datei `good_code` aus. Was passiert? * Starte `good_code` im Debugger `gdb`: * `gdb good_code` * `start` * `step`(mehrmals bis zum Fehler) * `bt`(Backtrace) * (`print x`) Probiere das gleiche mit der Datei `good_code.dbg` - diese wurde mit Debug-Symbolen kompiliert ### Aufgabe Python * starte den Python-Debugger mit `python3 -m pdb harshad.py` * gehe analog zur Verwendung von gdb vor ## Requestly [Requestly](https://requestly.io/) ist eine Plattform (Webseite, Browser-Extension, Desktop-App) um HTTP-Requests aufzuzeichnen, umzuleiten oder zu modifizieren. Dadurch kann man schnell z.B. Probleme im Frontend-Code identifizieren / überpinseln. ### Aufgabe * lege einen Account auf requestly.io an * exploriere die Funktionen dort * Nutze eine Filterregel, um herauszufinden, was im Frontend passiert, wenn eine URL im Backend nicht funktionier. * Beispiel-Anwendung dafür: https://loc.app.uni-regensburg.de/ ## Weiterführende Links * https://computingeducation.de/proj-debugging/ * https://pvs-studio.com/en/blog/posts/cpp/a0065/ * https://patrickthomson.tumblr.com/post/2499755681/the-best-debugging-story-ive-ever-heard * https://markodenic.com/use-console-log-like-a-pro/ * https://www.programiz.com/javascript/debugging