Alt 29.04.2006, 16:03:37   #1
theHacker
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.689
Beitrag Debugging: Hilfe, da ist ein Fehler!

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

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

Weiteres folgt irgendwann mal
theHacker ist offline   Mit Zitat antworten
Alt 29.04.2006, 16:04:58   #2
theHacker
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.689
Standard 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-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
 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"
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-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
 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
Mit dem korrigierten Code erhält man die korrekte Ausgabe "12367":
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
 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"
theHacker ist offline Threadstarter   Mit Zitat antworten
Alt 29.04.2006, 16:05:50   #3
theHacker
sieht vor lauter Ads
den Content nicht mehr
Benutzerbild von theHacker

ID: 69505
Lose senden

theHacker eine Nachricht über ICQ schicken theHacker eine Nachricht über Skype™ schicken
Reg: 20.04.2006
Beiträge: 22.689
Standard 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-Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
 <?php
if(isset($_COOKIE['user']))
{
  echo 
"Hallo ".$_COOKIE['user']." !";
}
else if(
$_POST['login']==&& 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

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-Code:
1:
 if(isset($_COOKIE['user'])) 
Diese is abhängig von $_COOKIE['user'].

Der Trick - welch ein Trick : einfach das Array mal ausgeben lassen:
PHP-Code:
1:
2:
3:
4:
5:
6:
7:
 <?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'].
theHacker ist offline Threadstarter   Mit Zitat antworten
Alt 19.02.2007, 21:51:36   #4
TriloByte
Benutzer

ID: 27303
Lose senden

Reg: 28.01.2007
Beiträge: 87
Standard

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
 
TriloByte ist offline   Mit Zitat antworten
Alt 29.12.2007, 21:27:38   #5
djws
www.zocke.es
Benutzerbild von djws

ID: 31169
Lose senden
Reallife

djws eine Nachricht über ICQ schicken
Reg: 20.04.2006
Beiträge: 4.479
Standard

Zitat:
Zitat von TriloByte Beitrag anzeigen
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 !
djws ist offline   Mit Zitat antworten
Antwort

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
ICQ-Fehler Hilfe excalmon Software/Windows 16 22.02.2008 10:42:22
[S] Hilfe für MySQL-Fehler für 20.000 Computerspezi Lose4Scripts (erledigt) 3 23.01.2007 23:36:37
100k für Debugging Antigo Lose4Action 11 25.10.2006 23:09:31
Fehler!Hilfe benötigt! Playboynikone Lose4Scripts (erledigt) 4 01.10.2006 10:56:49


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:27:45 Uhr.