Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Anweisung um in den Debug-Mode zu kommen (https://www.delphipraxis.net/206674-anweisung-um-den-debug-mode-zu-kommen.html)

KarllerntDelphi 18. Jan 2021 10:08

Anweisung um in den Debug-Mode zu kommen
 
Hallo,

gibt es einen Befehl,mit dem ich in den Debug-Modus schalten kann.

z.B.

if i <> 0 then DEBUGSTART.

Danke

Karl

Dalai 18. Jan 2021 10:53

AW: Anweisung um in den Debug-Mode zu kommen
 
Debugging findet in aller Regel unabhängig vom geschriebenen Code statt. Wenn du an einer bestimmten Stelle debuggen willst, so setze einen Breakpoint und/oder steppe mit Einzelschritt (F7) bzw. F8 durch. Man kann auch bedingte Breakpoints setzen, also solche, die erst greifen, wenn z.B. eine Variable einen bestimmten Wert hat.

Grüße
Dalai

Der schöne Günther 18. Jan 2021 10:59

AW: Anweisung um in den Debug-Mode zu kommen
 
Mir ist überhaupt nicht klar was du möchtest. Willst du mit deinem Code erreichen, dass der laufende Debugger deine Anwendung anhält, so als wärst du auf einen Haltepunkt gelaufen? Das geht (beispielsweise) mit DebugBreak() aus WinApi.Windows. Auf anderen Plattformen wüsste ich jetzt nicht wie das geht.

Bbommel 18. Jan 2021 11:04

AW: Anweisung um in den Debug-Mode zu kommen
 
Dennoch kann es unter bestimmten Umständen sinnvoll sein, codeseitig den Debugger aufzurufen. Bedingte Breakpoints können den Code ganz schän abbremsen, so dass es sehr lange dauern kann, bis eine Bedingung erfüllt ist und die Ausführung dann auch stoppt, obwohl es im normalen Betrieb sehr schnell geht.

In solchen Fällen kann es sinnvoll sein, den Debugger-Aufruf vorübergehend (!) direkt in den Code einzubauen. Ich kenne die Lösung allerdings nur für Win32. Da geht das so:

Delphi-Quellcode:
if i<>0 then
  asm
    int 3
  end;
Wie das bei anderen Plattformen funktioniert, weiß ich allerdings nicht. Aber vielleicht reicht dir Win32 ja für den Anfang.

dummzeuch 18. Jan 2021 11:28

AW: Anweisung um in den Debug-Mode zu kommen
 
Zitat:

Zitat von Bbommel (Beitrag 1481114)
In solchen Fällen kann es sinnvoll sein, den Debugger-Aufruf vorübergehend (!) direkt in den Code einzubauen. Ich kenne die Lösung allerdings nur für Win32. Da geht das so:

Delphi-Quellcode:
if i<>0 then
  asm
    int 3
  end;

Oder man fügt nur ein NOP ein und setzt darauf einen ganz normalen Breakpoint:

Delphi-Quellcode:
if i<>0 then
  asm
    nop // <<== Breakpoint hier setzen
  end;
Dann ist es nicht anz so schlimm, wenn man vergisst, diesen Code wieder zu entfernen.

Zitat:

Zitat von Bbommel (Beitrag 1481114)
Wie das bei anderen Plattformen funktioniert, weiß ich allerdings nicht. Aber vielleicht reicht dir Win32 ja für den Anfang.

Da asm-Code nur für Win32 unterstützt wird, funktioiert auch dieses nop nur für Win32.

KarllerntDelphi 18. Jan 2021 12:45

AW: Anweisung um in den Debug-Mode zu kommen
 
Ich kenne das Ganze aus der SAp-Umgebung. Dort kann man in der Programmsprache die
Anweisung Break-Point. setzen und bei der Ausführung hält das Programm
an der entsprechenden Stelle an und verzweigt in den Debug-Modus. ich wollte nur
wissen, ob es etwas Vergleichbares in delphi gibt.
Die Möglichkeiten des Debugging sind mir ansonsten vertraut. Auch die Möglichkeiten
von Variablenwerte abhängige Haltepunkt zu deinieren.
Trotzdem danke für all die Antworten.
Ich wollte mir eine einfache Möglichkeit schaffen bei bestimmten Werten,
welche ich an einer beliebigen Stelle definiere, nicht jedesmal einen Haltepunkt setzen zu müssen,
sondern das mit einer allgemeinen Prozedur abzufackeln.

procedure haltehier(variable,haltewert : string);
begin
if haltewert = '' then exit;
if variable = haltewert.
break-point.
endif.
end;

Das hätte mir die Möglichkeit geschaffen,a unterschiedliche Stellen im Programm
haltehier(variable, 'Haltewert');
einzubauen. Das hätte ich dann für späteres debugging
einfach im Code gelassen und die Wette auf '' gesetzt.

Für jene, die das für eine blöde Idee halten, okay, ist es vielleicht, aber ich hatte schon blödere.....

Danke

Karl

Bbommel 18. Jan 2021 12:52

AW: Anweisung um in den Debug-Mode zu kommen
 
Hallo Karl,

du hast ja von Thomas, mir und dem schönen Günther Vorschläge bekommen, wie du genau das machen kannst. Oder war daran noch etwas unklar? Ich frage nach, weil du so im Konjunktiv schreibst.

Uwe Raabe 18. Jan 2021 13:08

AW: Anweisung um in den Debug-Mode zu kommen
 
Zitat:

Zitat von KarllerntDelphi (Beitrag 1481122)
Ich wollte mir eine einfache Möglichkeit schaffen bei bestimmten Werten,
welche ich an einer beliebigen Stelle definiere, nicht jedesmal einen Haltepunkt setzen zu müssen,
sondern das mit einer allgemeinen Prozedur abzufackeln.

Das hätte aber den Nachteil, dass der "Haltepunkt"-Code immer dabei ist und zumindest die Lesbarkeit des Codes verschlechtert.

Alternativ kannst du aber auch einen Haltepunkt setzen und dem eine Bedingung mitgeben. Dann hält der Debugger nur dann an dem Haltepunkt, wenn die Bedingung erfüllt ist. Vorteil ist, dass der eigentliche Code keine künstlichen Debug-Anweisungen enthält.

Delbor 18. Jan 2021 13:08

AW: Anweisung um in den Debug-Mode zu kommen
 
Hi Karl

Du kannst auch an gewissen Stellen die Werte verschiedener Variablen in zB. eine Liste speichern:

Delphi-Quellcode:
procedure TFormxxx.FormCreate(Sender: TObject);
begin
  FReportList := TStringlist.Create();
end;
Erzeugen der Liste. Die muss dann bei FormDestroy wieder zerstört werden.

Delphi-Quellcode:
procedure TOpenFileFrame.FileSearcher1MatchFound(Sender: TObject;
  const Path: string; const FileInfo: TSearchRec);
  var Complettpath, J: String;
begin
  if Assigned(FCurrentNode) then
  begin
    Complettpath := IncludeTrailingPathDelimiter(Path) +  FileInfo.Name;  //    Complettpath := DeleteDrivesName(Complettpath);
    AddNewNode(FCurrentNode, FileInfo.Name, Complettpath,TSearchRecAnalyzer.IsDirectory(FileInfo));
    FReportList.Add('  TOpenDlg.FileSearcher1MatchFound');
    FReportList.Add('  -- Complettpath := : '+ Complettpath);
    FReportList.Add('  -- J        := ' + J);
    FReportList.Add('  -- FFileType       := ' + FFileType);
    FReportList.Add('  -- FPathlist.Count := : '+ IntToStr(FPathlist.Count));
  end;
end;
Füllen der Liste während des Programmlaufs

Erzeugt einn Filestream und speichert die Liste darin. TFileStream.Create schlägt fehl, wenn die Datei schon existiert. So kann ich jeden Testlauf in einer eigenen Liste/Datei festhalten:

Delphi-Quellcode:
procedure TMainForm.WriteReportFile;
  var S, DateTimeStr, DS: string;
      ReportStream: TFileStream;
begin
 DS := DateTimeToStr(Now);
 DateTimeStr := StringReplace(DS, ':', '-', [rfReplaceAll]);
  S := ExtractFilePath(Application.ExeName) + '\' + 'CodeReport ' +DateTimeStr+'.txt';
  Reportstream := TFileStream.Create(S, fmCreate);
  try
    FReportList.insert(0,DateTimeToStr(Now));
    FReportlist.Insert(1,'----------------');
    FReportlist.SaveToStream(ReportStream);
  finally
    Reportstream.Free;
  end;
end;

Mit ReplaceStr werden alle Doppelpunkte aus Now entfernt und durch Bindestriche ersetzt. Doppelpunkte sind in Dateinamen zumindest bei Delphi/Windows nicht erlaubt.

Gruss
Delbor

KarllerntDelphi 18. Jan 2021 14:05

AW: Anweisung um in den Debug-Mode zu kommen
 
Zitat:

Zitat von Bbommel (Beitrag 1481123)
Hallo Karl,

du hast ja von Thomas, mir und dem schönen Günther Vorschläge bekommen, wie du genau das machen kannst. Oder war daran noch etwas unklar? Ich frage nach, weil du so im Konjunktiv schreibst.

Nein, danke, alles klar.
Vielen Dank für die Antworten und Vorschläge.

Karl


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:20 Uhr.
Seite 1 von 2  1 2   

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