Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Gemeiner Programmabsturz, wie weiter machen? (https://www.delphipraxis.net/160202-gemeiner-programmabsturz-wie-weiter-machen.html)

wicht 2. Mai 2011 14:48


Gemeiner Programmabsturz, wie weiter machen?
 
Hi Forum.

Die Frage ist vielleicht etwas 'doof', aber ich war noch nie in dieser Situation. Darum wollte ich mal fragen, was ihr in so einem Fall macht, oder wie ich überhaupt weiterkomme.
Also, Programm gebaut, sogar madExcept mit drin. Zuhause ist es schon seit Monaten nicht mehr abgestürzt, und absichtliche Exceptions zum testen zeigen mir auch das madExcept-Fenster wie gewünscht. Das Programm nutze ich, einfach um zu sehen, wie es so läuft, nebenbei auch auf der Arbeit. Manchmal verabschiedet es sich dann allerdings - kein madExcept kommt, einfach dieses Fenster "Programm hat ein Problem und muss beendet werden", dadrunter läuft dann diese Marquee-Progressbar, wie das seit Vista eben so ist. Nach ein paar Sekunden kommt dann die Frage, ob ich debuggen möchte. Habe hier allerdings kein Delphi, nur Visual Studio. Dann kann ich wohl zu der Adresse springen, wo es geknallt hat. Die Frage, die ich mir jetzt stelle, ist, ob mir diese Information irgendetwas bringt..

Das sieht bei einer der letzten Builds des Programms so aus:

Code:
004054CA je         004054D3 
004054CC mov        dl,1 
004054CE mov        ecx,dword ptr [eax]
004054D0  call       dword ptr [ecx-4]    <-- Bumm
004054D3  ret            
004054D4  push       ebx
004054D5  push       esi
Bei der aktuellen so:

Code:
0040550A je         00405513 
0040550C mov        dl,1 
0040550E mov        ecx,dword ptr [eax]
00405510  call       dword ptr [ecx-4]    <-- Bumm
00405513  ret
00405514  push       ebx
00405515  push       esi
Wie würdet ihr mit diesem Problem jetzt weiter verfahren? Wie kommt man mit diesen Infos an die Stelle Delphi-Code, die hier Probleme macht? Oder wäre es am besten, Delphi auf diesem Rechner hier zu installieren? Ist nur etwas blöd, für den Firmenrechner eine Aktivierung mit meiner Lizenz durchzuführen..

Würde mich sehr über Antworten sehr freuen!


Liebe Grüße und TIA,

Alex

s.h.a.r.k 2. Mai 2011 15:14

AW: Gemeiner Programmabsturz, wie weiter machen?
 
Kann man madExcept so einrichten, dass es lediglich im Debug-Modus anspringt? Nutze das leider nicht, aber denkbar wäre es. Daher könntest du evtl. auch nicht eine passende Meldung erhalten.

Aphton 2. Mai 2011 15:26

AW: Gemeiner Programmabsturz, wie weiter machen?
 
Man könnte das Problem indirekt durch exzessives Logging angehen.
Aber das ist nicht unbedingt optimal. Ich mache das bei all den Debugversionen meiner Projekte so!

Satty67 2. Mai 2011 15:37

AW: Gemeiner Programmabsturz, wie weiter machen?
 
Das dem Programm die Handlungsfähigkeit (weit nach der Initialisierung) völlig entzogen wird, ist ja dann fast immer ein DEP-Problem, oder?

Die erste Frage wäre dann, ob die Bereichsprüfung eingeschaltet ist.

rollstuhlfahrer 2. Mai 2011 15:59

AW: Gemeiner Programmabsturz, wie weiter machen?
 
Nachdem Delphi das Programm einmal ausgeführt hat und danach nicht geschlossen wurde, kannst du mit Suche->Laufzeitfehler die Adresse des Fehlers eingeben und kommst zu dem CPU-Fenster. Dort wird dir neben dem ASM-Code hoffentlich auch ein wenig deines Delphi-Codes angezeigt. Wenn nicht, dann ist das Pech.

Bernhard

wicht 2. Mai 2011 18:30

AW: Gemeiner Programmabsturz, wie weiter machen?
 
Danke erstmal für eure Antworten!

Zitat:

Zitat von s.h.a.r.k (Beitrag 1098347)
Kann man madExcept so einrichten, dass es lediglich im Debug-Modus anspringt? Nutze das leider nicht, aber denkbar wäre es. Daher könntest du evtl. auch nicht eine passende Meldung erhalten.

Habe ich vor dem Bauen überprüft und gerade nocheinmal getestet. Funktioniert im Release-Modus.

Zitat:

Zitat von Aphton (Beitrag 1098350)
Man könnte das Problem indirekt durch exzessives Logging angehen.
Aber das ist nicht unbedingt optimal. Ich mache das bei all den Debugversionen meiner Projekte so!

Naja. Eigentlich würde ich auch so vorgehen, aber dafür wäre es schön, zu wissen, womit der Fehler zu tun hat, oder dass er irgendwie reproduzierbar ist. Er tritt aber dummerweise einfach irgendwann auf. Das wäre also die Möglichkeit, die ich als letztes angehen würde.

Zitat:

Zitat von Satty67 (Beitrag 1098351)
Das dem Programm die Handlungsfähigkeit (weit nach der Initialisierung) völlig entzogen wird, ist ja dann fast immer ein DEP-Problem, oder?

Die erste Frage wäre dann, ob die Bereichsprüfung eingeschaltet ist.

Bereichsprüfung ist deaktiviert. DEP ist bei mir nur für "erforderliche Windows-Programme und -Dienste" aktiv. Morgen mal schauen, wie das auf dem anderen Rechner parametriert ist.

Zitat:

Zitat von rollstuhlfahrer (Beitrag 1098364)
Nachdem Delphi das Programm einmal ausgeführt hat und danach nicht geschlossen wurde, kannst du mit Suche->Laufzeitfehler die Adresse des Fehlers eingeben und kommst zu dem CPU-Fenster. Dort wird dir neben dem ASM-Code hoffentlich auch ein wenig deines Delphi-Codes angezeigt. Wenn nicht, dann ist das Pech.

Bernhard

Das hört sich sehr interessant an. Leider habe ich unter "Suche" keinen Punkt "Laufzeitfehler". Ich kann nur Pausieren, dann das CPU-Fenster aufmachen, und sagen "Gehe zu Adresse..." - dann stehen in der Ansicht überall nur "???" .. Mache ich irgendetwas falsch?


Nochmal vielen Dank für die Hilfe.

Aphton 2. Mai 2011 18:38

AW: Gemeiner Programmabsturz, wie weiter machen?
 
Nun, so einfach dürfte das nicht gehen.
Die Imagebase Adresse kann und wird vom PE Loader geändert (warum - spielt keine Rolle).
Deshalb solltest du, falls das Programm abstürtzt, nicht nur die Adresse, an die EIP zuletzt gezeigt hat, war merken, sondern auch die Imagebase. Und am besten merkst du dir nur die Differenz der beiden (Letzte Adresse - Imagebase). Dann hast du nämlich die relative virtuelle Adresse und kannst bei dir daheim dann deiner eigenen Imagebase (der Exe, zur Laufzeit ermittelt) diesen relativen Wert aufaddieren und hast letztendlich somit die Adresse, wo es geknallt hat.
Ist schwer zu verstehen, wenn man keine Ahnung von PE (PortableExecutable Format) hat, aber du kannst gerne nachfragen, falls es dich interessiert.

rollstuhlfahrer 2. Mai 2011 18:41

AW: Gemeiner Programmabsturz, wie weiter machen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Genau deswegen hatte ich ja auch geschrieben, möglichst Delphi nach dem Kompilat nicht mehr zu bedienen, da dann noch die Funktion aktiv ist und Delphi nicht neu kompiliert, wodurch sich alles ändern kann.

Bernhard

ADD: Es gibt immer noch die Möglichkeit einer MAP-Datei. Darin steht dann, was wo im Speicher liegt. Das ist dann aber nicht mehr mein Gebiet.

ADD2: Ich hab mal ein Screen hochgeladen, wo bei mir diese Option im Menü ist.

Aphton 2. Mai 2011 18:44

AW: Gemeiner Programmabsturz, wie weiter machen?
 
Das hat nichts mit dem Kompilieren zu tun. Der PE Loader macht das zur Laufzeit, falls es nötig ist.
Auf verschiedenen Systemen (kommt darauf an, wie der RAM Speicher belegt ist), kann er verschieden reagieren!

brechi 2. Mai 2011 20:40

AW: Gemeiner Programmabsturz, wie weiter machen?
 
In dem Fall hat sich die Imagebase nicht geändert und es ist auch sehr unwahrscheinlich, dass sie sich beim Programm ändert. Setz im Programm nen Breakpoint am Start der aufgerufen wird und drück STRG+ALT+C dann STRG+G und gib die Adresse mit $ ein.

Im übrigen ist es sehr wahrscheinlich ein Aufruf von TObject.Free

Delphi-Quellcode:
00403559 E87A010000       call @ClassDestroy
0040355E C3               ret
0040355F 90               nop
TObject.Free:
00403560 85C0             test eax,eax
00403562 7407             jz $0040356b
00403564 B201             mov dl,$01
00403566 8B08             mov ecx,[eax]
00403568 FF51FC          call dword ptr [ecx-$04]
0040356B C3               ret
TObject.InitInstance:
0040356C 53               push ebx
0040356D 56               push esi
Im übrigen kannst du auch Delphi installieren und die 30 Tage Testversion verwenden, musst es also nicht aktivieren.


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