Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#2

AW: Warum habe ich manchmal keinen Stack bzw. was tue ich dann?

  Alt 8. Dez 2019, 16:49
Wenn zuviel zerschossen wurde (vor allem der Stack überschrieben), dann kann es passieren, dass sich hier nichts mehr machen lässt.

Erste Versuche:
  • Aktiviere mal in den Projektoptionen das Erstellen der Stack-Frames. (bei kleinen Funktionen können die sonst wegoptimiert werden und erschweren das Auslesen des Stacks)
    • im Debug-Profil sollte das aber standardmäßig aktiv sein
    • und zusätzlich das Inlineing deaktivieren
    • siehe Projektoptionen > Erzeugen > Compilieren > Quelltexterzeugung
      und drüber unter Debuggen die Debuginfos und Symbolinfos aktiv
  • Alternativ für 64 Bit kompilieren, denn da wurde etwas "ausgemistet" (immer Stackframes und nur noch eine Aufrufkonvention, welche zufällig fast so aussieht, wie Pascal es schon immer macht > von links nach Rechts zuerst in die Register)
  • Optimierungen aus kann, aber muß hier nicht sein (wichtiger sind die Optionen den Stack betreffend)

Ingame den Stacktrace auslesen
  • selbst den Stack auslesen (MSDN-Library durchsuchenWalkStack oder so), aber hilft nichts, da Delphi leider keine programmseitigen Debuginfos liefert, bzw. man die nicht auslesen kann,
    und leider sind sie auch zu doof eine Option anzubieten zusätzlich die Debuginfos in einem Windows-Format anzubieten.
    • du kannst natürlich die gelieferten Adressen manuell in der MAP Datei nachlesen, welche man sich erstellen lassen kann
    • oder im CPU-Fenster schauen, was an den Addressen angezeigt wird (kurz davor)
    • oder man lässt sich die MAP von Fremdprogrammen in eine DBG- oder PDB-Datei konvertieren, mit der die DebugAPI etwas anfangen kann MSDN-Library durchsuchenSymGetSymFromAddr)
      • eine Mini-Fehlerbehandlung lässt sich relativ leicht selber basteln (3 Funktionen), wem sowas wie Eurekalog zuviel ist, was sich mit all seinen kranken Hocks und Hacks im Programm breit macht)
  • oder z.B. sowas wie MadExcept, Eurekalog oder das JEDI-Errorzeugs



oder manuell am Programmablauf rumpfuschen
  • zuerst
    • Tools > Optionen > Debugger-Optionen > Embarcadero-Debugger > Native BS-Exceptions
    • 32 Bit > Zugriffsverletzung ($C0000005) > Debugger + Behandelt
  • F9
  • warten bis es dort wieder knallt
  • Debuggermeldung: Anhalten
  • wenn im Code gelandet: Ansicht > Debug-Fenster > CPU-Fenster > CPU (Strg+Alt C)
    • es ist immernoch ein Sch****dreck, dass neue Delphi-Projekte seit zuvielen Jahren per Standard mit Debug-DCUs kompileren, obwohl die standardmäßig kein Schwein braucht
  • Problemzeilen überspringen (hier bis zum RET, also Selektion dort draufsetzen)
  • dort im Context-Menü > Neuer EIP (Strg+N)
  • und mit F7 fortsetzen
  • mal sehen wo es dann weitergeht (erstmal aus deinen beiden Copy/Move-Prozeduren raus)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Dez 2019 um 17:10 Uhr)
  Mit Zitat antworten Zitat