Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Warum habe ich manchmal keinen Stack bzw. was tue ich dann? (https://www.delphipraxis.net/202782-warum-habe-ich-manchmal-keinen-stack-bzw-tue-ich-dann.html)

Der schöne Günther 8. Dez 2019 13:30

Warum habe ich manchmal keinen Stack bzw. was tue ich dann?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Angenommen ich habe im laufenden Programm eine Access Violation. Wenn ich im Debugger anhalte sehe ich nur dass es im Hauptthread passiert. Der Stack ist praktisch leer:

Code:
System.Move(???,???,???)
System._CopyRecord
Anhang 51908

Die .exe ist mit allen möglichen Debug-Daten, alle Optimierungen sind aus. Win32. Was mache ich falsch? Warum habe ich keinen Stack?

himitsu 8. Dez 2019 16:49

AW: Warum habe ich manchmal keinen Stack bzw. was tue ich dann?
 
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)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 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