Debugging: Hilfe, da ist ein Fehler!

theHacker

sieht vor lauter Ads den Content nicht mehr
Teammitglied
ID: 69505
L
20 April 2006
22.680
1.315
Irgendwie find ich es schade, dass viele immer nur posten, dass da irgendwo ein Fehler is, nie aber ernsthaft versuchen, ihn selber zu beseitigen. Entweder ihr seid zu faul oder ihr könnts ned. Für Letztere ist dieser Thread vielleicht hilfreich.

Wenn irgendwo ein Fehler ist und man ihn nicht findet, muss man sich an die - manchmal sehr mühsame, langweilige und sogar zeitaufwändige - Arbeit des Debuggings machen.

Die nachfolgende Beispiele beziehen sich hauptsächlich auf PHP, können aber auf alle Programmiersprachen übertragen werden. Ein paar Kniffe können euch vielleicht hilfreich sein.

Übersicht

:arrow: Ablaufsteuerung: Code wird einfach nicht ausgeführt
:arrow: Variablen: Falsche Werte

Weiteres folgt irgendwann mal ;)
 
Ablaufsteuerung: Code wird einfach nicht ausgeführt

Ablaufsteuerung: Code wird einfach nicht ausgeführt

Ein Code wird einfach nicht ausgeführt. Um das zu prüfen, hilft es vor und hinter jeden Block einfach etwas auszugeben. Ich verwende immer Zahlen, um so ablesen zu können, wo das Programm/Script langläuft.
PHP:
 echo "Hier geht was ned !";
$var=$_GET['var'];

if($var==1)
{
  if($var==3)
  {
    echo "Hier will ich hin";
  }
  else if($var==4)
  {
    echo "Auch gut.";
  }
  else
  {
    echo "Was anderes";
  }
}
Ruft man dieses Script mit ?var=3 auf, finden wir keine Ausgabe von "Hier will ich hin" :hö:
Der Fehler is hier zwar offensichtlich, aber als Beispiel -denke ich- gut geeignet.

Jetzt wird der Code mit jeder Menge echos präpariert. Am besten packt man vor und hinter jeden Block (also immer auf die geschweiften Klammern gucken) eine Ausgabe:
PHP:
 echo "Hier geht was ned !";
$var=$_GET['var'];

echo "1";
if($var==1)
{
  echo "2";
  if($var==3)
  {
    echo "3";
    echo "Hier will ich hin";
  }
  else if($var==4)
  {
    echo "4";
    echo "Auch gut.";
  }
  else
  {
    echo "5";
    echo "Was anderes";
  }
  echo "6";
}
echo "7";
Mit unseren neuen echos erhalten wir jetzt die Ausgabe "17", was also bedeutet, dass er nicht in den ersten if-Block springt - ja verständlich wegen der Bedingung :ugly:
Mit dem korrigierten Code erhält man die korrekte Ausgabe "12367":
PHP:
 echo "Hier geht was ned !";
$var=$_GET['var'];

echo "1";
if($var) // fixed
{
  echo "2";
  if($var==3)
  {
    echo "3";
    echo "Hier will ich hin";
  }
  else if($var==4)
  {
    echo "4";
    echo "Auch gut.";
  }
  else
  {
    echo "5";
    echo "Was anderes";
  }
  echo "6";
}
echo "7";
 
Variablen: Falsche Werte

Variablen: Falsche Werte

Falsche Variablen-Werte erkennt man immer daran, dass das Programm nicht das macht, was man will.
Als Beispiel ein kleiner PHP-Login:
PHP:
 <?php
if(isset($_COOKIE['user']))
{
  echo "Hallo ".$_COOKIE['user']." !";
}
else if($_POST['login']==1 && isset($_POST['username']))
{
  setcookie("username",$_POST['username']);
  header("location: ".$_SERVER['PHP_SELF']);
  exit;
}
else
{
?>
  <form action="login.php" method="post">
  <input type="hidden" name="login" value="1" />
  <input type="text" name="username" value="(hier Username)" />
  <input type="submit" value="Login !" />
  </form>
<?php
}
?>
Auf den ersten Blick korrekt, doch wenn man das Formular ausfüllt, wird man nicht eingeloggt, sondern das Formular kommt wieder :hö:

Nachdem man den Ablauf kontrolliert hat, stellt man fest, dass das Script einmal den zweiten Block ausführt - nachdem das Formular gePOSTet wurde - und danach immer den unteren Block nimmt, nie den oberen.
Hier sollten wir uns die if-Bedingung genauer angucken:
PHP:
 if(isset($_COOKIE['user']))
Diese is abhängig von $_COOKIE['user'].

Der Trick - welch ein Trick :yawn:: einfach das Array mal ausgeben lassen:
PHP:
 <?php
print_r($_COOKIE);
if(isset($_COOKIE['user']))
{
  echo "Hallo ".$_COOKIE['user']." !";
}
// ....
Schnell sieht man, dass $_COOKIE['user'] überhaupt nicht gesetzt ist, sondern $_COOKIE['username'].
 
Die Zend IDE, PHPEd etc. bieten btw. nette eingebaute Debugger, die einem solche var_dump/echo - Spielchen ersparen. Finde ich persönlich wesentlich streßfreier ;)
 
Die Zend IDE, PHPEd etc. bieten btw. nette eingebaute Debugger, die einem solche var_dump/echo - Spielchen ersparen. Finde ich persönlich wesentlich streßfreier ;)

klar sind "fertige" Debugger vielleicht schneller / streßfreier, aber so lernt man selbst mehr meiner Meinung nach !