Matthias Apsel: Debugging - besonders lange Fehlersuche

Hallo alle,

aufgrund einiger aktueller Threads, möchte ich die Fehlersuchen zusammentragen, die sehr lange gedauert haben und bereits mit sehr kleinem Aufwand behoben werden konnten, frei nach dem Motto kleine Ursache – große Wirkung.


Meine Lieblingsfehlermeldung ist für prepared statements number of bound variables does not match number of tokens. Die Fehlermeldung entsteht natürlich in der Zeile, in der das Statement ausgeführt wird. Ich hatte ca. 10 Spalten zu bearbeiten und der Fehler war
…, foo = : bar, … statt …, foo = :bar, …

Ich hab alles gezählt …


So, nun seid ihr dran. Bei welcher Debugging-Aktion habt ihr so richtig 🤦‍♂️ bzw. 🤦‍♀️ machen müssen?

Bis demnächst
Matthias

--
Pantoffeltierchen haben keine Hobbys.
¯\_(ツ)_/¯
  1. Hi,

    …, foo = : bar, … statt …, foo = :bar, …

    Es gab (in Java) ein Member namens foolbar, die auf Änderungen durch eine Methode nicht reagiert hat, obwohl sie dort offensichtlich geändert wurde.

    Es gab in der Basisklasse der Basisklasse ein Member foo1bar - an das hat keiner gedacht - und das war das Member, das tatsächlich geändert wurde.

    cu,
    Andreas a/k/a MudGuard

  2. Hallo Matthias,

    So, nun seid ihr dran. Bei welcher Debugging-Aktion habt ihr so richtig 🤦‍♂️ bzw. 🤦‍♀️ machen müssen?

    mein längstes Debugging war einmal eine vergessene Initialisierung für eine Variable. Ich hatte sie als Abbruchbedingung benutzt, in diesem Stil:

    int c;
    
    while(!c) {
      // tu watt
    }
    

    Und habe über sage und schreibe 1,5 Tage nicht gesehen, was ich falsch mache… 😂

    LG,
    CK

  3. Hallo,

    aufgrund einiger aktueller Threads, möchte ich die Fehlersuchen zusammentragen, die sehr lange gedauert haben und bereits mit sehr kleinem Aufwand behoben werden konnten, frei nach dem Motto kleine Ursache – große Wirkung.

    nette idee. ;-)

    So, nun seid ihr dran. Bei welcher Debugging-Aktion habt ihr so richtig 🤦‍♂️ bzw. 🤦‍♀️ machen müssen?

    Ein Klassiker, der mir oft passiert ist: Offline editieren und sich wundern, warum man online nichts von der Änderung sieht.

    Ciao,
     Martin

    --
    Computer müssen weiblich sein: Eigensinnig, schwer zu durchschauen, immer für Überraschungen gut - aber man möchte sie nicht missen.
    1. So, nun seid ihr dran. Bei welcher Debugging-Aktion habt ihr so richtig 🤦‍♂️ bzw. 🤦‍♀️ machen müssen?

      Immer gerne wieder: Änderung auf Server A und sich wundern, warum auf Server B nix passiert :-)

    2. Hallo Martin,

      Variante: Im Development-Branch der Sourcecodeverwaltung eine Programmänderung machen, Build+Deploy über den CI/CD Toolstack laufen lassen, und nach 3-4 Versuchen merken, dass man den Merge in den Main-Branch vergessen hat.

      Rolf

      --
      sumpsi - posui - clusi
  4. Tach!

    class Program {
        static void Main(string[] args) {
            test();
        }
    
        private static async void test() {
            await Task.Delay(TimeSpan.FromSeconds(5));
        }
    }
    

    Warum zum Geier beendet sich das Programm sofort?

    dedlfix.

    1. Hallo dedlfix,

      Warum zum Geier beendet sich das Programm sofort?

      Weil die Methode test() async ist und du deshalb mit await drauf warten solltest.

      Allerdings... der Compiler frisst weder dies

      class Program {
          static void Main(string[] args) {
              test().Wait()
          }
      
          private static async void test() {
              await Task.Delay(TimeSpan.FromSeconds(5));
          }
      }
      

      noch dies (c# 7.1):

      class Program {
          static async void Main(string[] args) {
              await test();
          }
      
          private static async void test() {
              await Task.Delay(TimeSpan.FromSeconds(5));
          }
      }
      

      ja ei verbibscht - da muss wohl noch ein dritter nach dem Fehler suchen 😉

      Rolf

      --
      sumpsi - posui - clusi
      1. Tach!

        Warum zum Geier beendet sich das Programm sofort?

        Weil die Methode test() async ist und du deshalb mit await drauf warten solltest.

        Antworten zu geben war ja nicht der Sinn dieses Threads.

        In so einem Fall wundert man sich jedenfalls, warum nicht mal eine Fehlermeldung kommt und das asynchrone Zeug einfach abbricht.

        Allerdings... der Compiler frisst weder dies

        async void kann man nicht awaiten, das muss async Task sein.

        dedlfix.

        1. Hallo dedlfix,

          deswegen beschloss ich meine "Antwort" doch mit einem 😉 - ich wollte es ja nicht auflösen.

          Eine async void-Methode sollte aber tatsächlich vom Compiler oder von Resharper bemängelt werden.

          Rolf

          --
          sumpsi - posui - clusi
          1. Tach!

            Eine async void-Methode sollte aber tatsächlich vom Compiler oder von Resharper bemängelt werden.

            Nur wenn man sie zu awaiten versucht. Ansonsten ist das valide, damit die ganzen alten Eventhandler vom Typ void auch asynchronisiert werden können.

            dedlfix.

  5. Hallo Matthias,

    meine aufwändigste Fehlersuche liegt schon viele Jahre zurück, es muss so um 1990 gewesen sein, auf den PCs lief noch DOS.

    Ich hatte für unsere Vorlesung diverse C-Programme geschrieben, um Messdaten aus Vorlesungsexperimenten aufzubereiten und grafisch darzustellen, oder um bei Differentialgleichungen das Lösungsverhalten bei Parameteränderung zu zeigen. Das Computerbild wurde auf die Hörsaalmonitore gegeben, und später kam noch ein „Beamer“ dazu, ein auf den Overheadprojektor gelegtes LCD-Display.

    Die Programme wurden aus der Kommandozeile gestartet und haben mehrere Semester ihren Dienst verrichtet. Bei einer Weihnachtsvorlesung kamen dann auch noch Texteinblendungen dazu, Powerpoint gab es ja noch nicht. Da hier das Rechnerbild permanent auf die Monitore gegeben wurde, war die Kommandozeile störend und ich habe ein Steuerprogramm in C geschrieben, das die jeweiligen Programme blind gestartet hat.

    Das hat auch zweimal gut funktioniert, aber im dritten Jahr ist der PC abgestürzt. In der Zeit wurde der Hörsaal-PC ausgetauscht und es kam auch ein höheres DOS zum Einsatz. Da die Einzelprogramme liefen, hatte ich das Steuerprogramm in Verdacht, aber das war so übersichtlich, das da eigentlich nichts falsch sein konnte. Erschwerend kam noch hinzu, das der Fehler bei einer anderen Programmreihenfolge nicht oder an anderer Stelle auftrat. Ich habe da bestimmt eine Woche gesucht.

    Irgendwann war ich dann so weit, dass das Programm, das vor dem Absturz lief, eine alte und vielfach eingesetzte FFT-Routine enthielt. Und in dieser war ein Array der Länge 1024 angelegt, wurde aber mit 1025 Werten belegt, also ein klassischer Bufferoverflow, der aber erst nach ca. 5 Jahren zugeschlagen hat.

    Gruß
    Jürgen

  6. Hej Matthias,

    aufgrund einiger aktueller Threads, möchte ich die Fehlersuchen zusammentragen, die sehr lange gedauert haben und bereits mit sehr kleinem Aufwand behoben werden konnten, frei nach dem Motto kleine Ursache – große Wirkung.

    Auf eine Datei verweisen, die ganz, ganz sicher auf dem Server liegt, also jedenfalls eigentlich liegen müsste, weil lokal unter Windows hat es ja geklappt, auf dem Server aber nciht, obwohl man doch alles 1:1 kopiert hat…

    Aufruf z.B. per:

    <img src="image.jpg" alt="">
    

    Verzeichnis-Inhalt:

    - image.JPG
    - image.jpeg
    - Image.jpg
    - IMAGE.jpg
    - IMAGE.JPG
    

    😉

    Marc

    --
    Ceterum censeo Google esse delendam
    1. Hallo marctrix,

      serviere die Webseite mit IIS unter Windows, dann ist das gar kein Problem 😛

      Rolf

      --
      sumpsi - posui - clusi
      1. Hej Rolf,

        serviere die Webseite mit IIS unter Windows, dann ist das gar kein Problem 😛

        Da hast du wohl recht. - Du hast verstanden, warum es lokal funktioniert und auf dem Server nicht. Sollte man die Erklärung mitliefern?

        Gibt es jemanden, der nicht weiß, dass Windows nicht case sensitiv, Linux (meistens auf Servern installiert) dagegen sehr wohl?

        Marc

        --
        Ceterum censeo Google esse delendam
        1. Hallo,

          Gibt es jemanden, der nicht weiß, dass Windows nicht case sensitiv, Linux (meistens auf Servern installiert) dagegen sehr wohl?

          Gibt's bestimmt…
          Die eigentliche Frage ist aber, warum denn auf einem System, das traditionell drei Buchstaben für die Extension verwendet, eine *.jpeg-Datei erstellt wurde!?

          Gruß
          Kalk

          1. Hallo Tabellenkalk,

            mit der Tradition der Dreibuchstaben-Extension hat Windows seit NTFS gründlich gebrochen.

            Rolf

            --
            sumpsi - posui - clusi