Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Softwaretests und Qualitätssicherung (https://www.delphipraxis.net/86-softwaretests-und-qualitaetssicherung/)
-   -   Fehlersuche mit Benutzung v. Programmabbrüchen (https://www.delphipraxis.net/154611-fehlersuche-mit-benutzung-v-programmabbruechen.html)

EccoBravo 17. Sep 2010 14:19

Fehlersuche mit Benutzung v. Programmabbrüchen
 
Hallo,

es ist mitunter mühsam nach Fehlern zu debuggen.
Wie kann ich Programmabbrüche nach Fehlern benutzen, um effizient nach Fehlerstellen zu suchen.

Bislang hatte ich nach Setzen von Breakpoints solange mit F7 und F8 herumgeklickert bis der Abbruch kam. Das kann sehr mühsam werden.

Gibt es die Möglichkeit, nach F9 ein Programm bis zum Fehlerabbruch laufen zu lassen, dann 1-3 Schritte zurück zu gehen, und sich dann Variablenwerte anzusehen ?

Vielen Dank für einen effizienten Tip
EB

BUG 17. Sep 2010 14:31

AW: Fehlersuche mit Benutzung v. Programmabbrüchen
 
Es gibt afaik moderne Debugger*, die das beherrschen, der in Delphi eingebaute gehört aber nicht dazu (zumindest habe ich noch nichts davon gehört, so etwas würde doch beworben).

Du müsstest du fraglichen Werte selbst loggen.

*EDIT: Reverse Debugging scheint das Stichwort zu sein.

shmia 17. Sep 2010 17:03

AW: Fehlersuche mit Benutzung v. Programmabbrüchen
 
Sehr nützlich kann auch ein Stacktrace sein.
Das sieht z.B. so aus:
Code:
(000456CA){demo.exe    } [004466CA] Controls.TWinControl.WndProc + $1D2
(0001F0DC){demo.exe    } [004200DC] Classes.TReader.ReadDate + $8
(0001ABE0){demo.exe    } [0041BBE0] Classes.TThreadList.UnlockList + $4
(0002C1EC){demo.exe    } [0042D1EC] Graphics.FreeMemoryContexts + $98
(000452CC){demo.exe    } [004462CC] Controls.TWinControl.MainWndProc + $2C
(000452E1){demo.exe    } [004462E1] Controls.TWinControl.MainWndProc + $41
(0005894C){demo.exe    } [0045994C] Forms.StdWndProc + $14
(000452CC){demo.exe    } [004462CC] Controls.TWinControl.MainWndProc + $2C
(0005894C){demo.exe    } [0045994C] Forms.StdWndProc + $14
(0006284A){demo.exe    } [0046384A] Forms.TApplication.StopHintTimer + $12
(00061D27){demo.exe    } [00462D27] Forms.TApplication.ProcessMessage + $83
(00061D5E){demo.exe    } [00462D5E] Forms.TApplication.HandleMessage + $A
(00061F69){demo.exe    } [00462F69] Forms.TApplication.Run + $81
(006F2347){demo.exe    } [00AF3347] pss.initialization (Line 771, "C:\Delphi\Test\demo.dpr" + 56) + $7
Um einen Stacktrace zu bekommen muss man mit TD32-Debug-Info linken
und Bibliotheken verwenden (z.B. JEDI Code Library), die den Stacktrace erzeugen können.

Garfield 17. Sep 2010 17:24

AW: Fehlersuche mit Benutzung v. Programmabbrüchen
 
Wenn es reproduzierbare Fehler sind kann man an bestimmten Stellen Ausgaben in eine Datei bzw Konsole vornehmen und damit die Position des Fehlers einengen. Bzw kann man wohl mit den Adressen in der Fehlermeldung diese Stelle finden.

schöni 17. Mai 2012 09:38

AW: Fehlersuche mit Benutzung v. Programmabbrüchen
 
Zitat:

Zitat von BUG (Beitrag 1050303)
Es gibt afaik moderne Debugger*, die das beherrschen, der in Delphi eingebaute gehört aber nicht dazu (zumindest habe ich noch nichts davon gehört, so etwas würde doch beworben).

Du müsstest du fraglichen Werte selbst loggen.

*EDIT: Reverse Debugging scheint das Stichwort zu sein.

Hmmmmmm, aaaaber wie sieht das denn mit dem Debuginfo Format aus. Soweit ich weiß, verwendet Borland/Codegear/Embacadero das OMF Format. Während die GNU Tools das stabs oder dwarf Format verwenden. Welchen Workaround gibt es da für ein mit Delphi kompiliertes Programm?

jaenicke 17. Mai 2012 09:59

AW: Fehlersuche mit Benutzung v. Programmabbrüchen
 
Zitat:

Zitat von BUG (Beitrag 1050303)
Es gibt afaik moderne Debugger*, die das beherrschen, der in Delphi eingebaute gehört aber nicht dazu (zumindest habe ich noch nichts davon gehört, so etwas würde doch beworben).

Man kann in Delphi ja problemlos den Stack nach oben wandern (Doppelklick in der Stackanzeige) und sieht dann natürlich alle verfügbaren lokalen Variablen an den verschiedenen Stationen. Meistens findet man so zumindest eine Stelle, an der man mit einem Breakpoint einklinken kann, zudem werden die Breakpoints auch im Stack markiert und sind dort umschaltbar.

Rückwärts den Ablauf abspielen geht aber nicht, das würde wohl auch etwas schwierig werden.

Zur Fehlersuche hilft es auch insbesondere an oft durchlaufenen Stellen einfach den Haltepunkt auf "nicht anhalten" zu stellen und stattdessen nur Daten zu loggen (z.B. Variablenwerte auswerten oder einen Stacktrace bei jedem Durchlauf anzeigen). Danach kann man dann Haltepunktbedingungen oder die Aktivierung von Haltepunktgruppen darauf abstimmen und so relativ schnell zur Problemstelle kurz direkt vor dem Auftreten des Problems kommen.

jaenicke 9. Feb 2015 08:37

AW: Fehlersuche mit Benutzung v. Programmabbrüchen
 
Was hat das denn mit dem Thema zu tun? :?

Sir Rufo 9. Feb 2015 08:41

AW: Fehlersuche mit Benutzung v. Programmabbrüchen
 
Zitat:

Zitat von jaenicke (Beitrag 1289259)
Was hat das denn mit dem Thema zu tun? :?

Scheint der Bruder von SPAMela Anderson zu sein :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz