Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zugriffsverletzung Adresse 0000000 beim beenden (https://www.delphipraxis.net/194022-zugriffsverletzung-adresse-0000000-beim-beenden.html)

stalkingwolf 9. Okt 2017 07:42

Zugriffsverletzung Adresse 0000000 beim beenden
 
Guten Morgen,

nach dem ich ein Programm von D6 auf XE portiert habe, bekommt dieses Programm ab und zu beim beenden eine Fehlermeldung beim lesen von Adresse 0000000.
Die 0000000 wird wohl ein generischer Platzhalter sein.

Ich frag mich wie ich das debuggen kann?

Ab und zu läuft das Programm dadurch weiter. Ab und zu sogar mit 25% Leistung. Also quasi einem Kern.

hoika 9. Okt 2017 08:04

AW: Zugriffsverletzung Adresse 0000000 beim beenden
 
Hallo,
das sieht wie NIL-Zugriff aus.
-> MadExcept oder etwas ähnliches benutzen.

himitsu 9. Okt 2017 09:39

AW: Zugriffsverletzung Adresse 0000000 beim beenden
 
Oder auch einfach erstmal im Debugger startet und schauen, ob man nicht auch so schon sieht, wo es knallt. :stupid:

stalkingwolf 9. Okt 2017 09:42

AW: Zugriffsverletzung Adresse 0000000 beim beenden
 
Ne leider nicht.
ich probiere es mal mit madExcept

sakura 9. Okt 2017 09:43

AW: Zugriffsverletzung Adresse 0000000 beim beenden
 
Wenn Du mit dem Debugger nicht weiter kommst, dann empfehle ich dir aus madExcept. Da kannst Du Dir dann einen komplette Call-Stack anzeigen lassen, für den Moment der Exception.

Da es Dir beim Beenden der Anwendung passiert, könnte Dir auch FastMM4 weiter helfen, da du hier auch solche Informationen anzeigen lassen kannst. Ist generell eine gute Option als Speichermanager für Delphi Anwendungen.

...:cat:...

stalkingwolf 11. Okt 2017 08:19

AW: Zugriffsverletzung Adresse 0000000 beim beenden
 
Ok ich habe das Crashlog von madExcept. Aber woran erkenne ich nun woran es gelegen hat?

exception message : Externe Exception C000001D

Das war doch etwas aus der C Library welches Delphi nicht adressieren kann oder?
Ich kenne die Meldung wenn ich z.b in Delphi übersetze und dann ein shell_execute aufrufe. Dann tritt der Fehler ab und zu auch auf.

Luckie 11. Okt 2017 08:46

AW: Zugriffsverletzung Adresse 0000000 beim beenden
 
Also wenn es beim Beenden der Anwendung zu einer Exception kommt, dann sieht es so aus als wenn das Programm beim selbst Aufräumen noch auf etwas zugreifen will, was du schon freigegeben hast.

stalkingwolf 11. Okt 2017 09:20

AW: Zugriffsverletzung Adresse 0000000 beim beenden
 
Ich gebe nichts frei worauf das Programm noch zugreifen will bzw. sollte.
Vor allem da es unter Delphi 6 ohne Probleme sich beendet hat und unter XE auch nur ab und zu dazu kommt. Auch haben nicht alle unsere Kunden das Problem das die Fehlermeldung kommt.

sakura 11. Okt 2017 09:33

AW: Zugriffsverletzung Adresse 0000000 beim beenden
 
Hänge doch das Crash-Log mal an - lässt sich im Dialog als TXT-Datei speichern.

...:cat:...

Luckie 11. Okt 2017 12:12

AW: Zugriffsverletzung Adresse 0000000 beim beenden
 
Dann zerschießt du dir irgendwo den Speicher und hast bisher nur Glück gehabt.

generic 11. Okt 2017 13:37

AW: Zugriffsverletzung Adresse 0000000 beim beenden
 
Probier mal FastMM mit Fulldebugmode.

stalkingwolf 12. Okt 2017 08:05

AW: Zugriffsverletzung Adresse 0000000 beim beenden
 
Anbei die Fehlermeldung vom dem external exception beim beenden.
Ich hab sie etwas gekürzt. Module und Prozesse entfernt.

Code:
date/time         : 2017-10-11, 09:05:37, 943ms
computer name     : TS01
wts client name   :
user name         :
registered owner  : Windows-Benutzer
operating system  : Windows 2008 R2 x64 Service Pack 1 build 7601
system language   : German
system up time    : 25 days 22 hours
program up time   : 1 minute 55 seconds
processors        : 8x Intel(R) Xeon(R) CPU E5645 @ 2.40GHz
physical memory   : 7042/8191 MB (free/total)
free disk space   : (C:) 222,03 GB
display mode      : 1920x1080, 16 bit
process id        : $e5c
allocated memory  : 47,44 MB
largest free block : 792,48 MB
executable        : programm.exe
exec. date/time   : 2017-10-09 15:02
version           : 1.0.0.0
compiled with     : Delphi XE4
contact name      :
contact email     :
madExcept version : 4.0.18
callstack crc     : $66ef8f7a, $82e8af82, $82e8af82
exception number  : 1
exception class   : EExternalException
exception message : Externe Exception C000001D.

main thread ($5d4):
00530051 +02d programm.exe     System.Classes         TStream.ReadBufferData
0067bfe5 +01d programm.exe     Vcl.Menus              TPopupList.MainWndProc
00541530 +014 programm.exe     System.Classes         StdWndProc
778e0107 +02b ntdll.dll                           KiUserCallbackDispatcher
004093d0 +008 programm.exe     System        622   +0 TObject.Free
005bf685 +019 programm.exe     Vcl.Controls           DoneControls
005c12f7 +02b programm.exe     Vcl.Controls           Finalization
0040aada +03e programm.exe     System        622   +0 FinalizeUnits
004ab290 +054 programm.exe     madExcept              InterceptFinalizeUnits
004ab298 +000 programm.exe     madExcept              InterceptHalt0FinalizeUnits
0040af11 +09d programm.exe     System        622   +0 @Halt0
00b51802 +70a programm.exe     P70            184 +109 initialization
765a3368 +010 kernel32.dll                        BaseThreadInitThunk

thread $828:
778f1f3f +0b ntdll.dll    NtWaitForWorkViaWorkerFactory
765a3368 +10 kernel32.dll BaseThreadInitThunk

thread $a40:
778f0156 +0e ntdll.dll    NtWaitForMultipleObjects
765a3368 +10 kernel32.dll BaseThreadInitThunk

thread $1014:
778ef8ca +0e ntdll.dll               NtWaitForSingleObject
76431497 +92 KERNELBASE.dll          WaitForSingleObjectEx
765a118f +3e kernel32.dll            WaitForSingleObjectEx
765a1143 +0d kernel32.dll            WaitForSingleObject
004abec1 +0d programm.exe       madExcept CallThreadProcSafe
004abf26 +32 programm.exe       madExcept ThreadExceptFrame
765a3368 +10 kernel32.dll            BaseThreadInitThunk
>> created by main thread ($5d4) at:
74ae4c95 +00 winspool.drv

thread $784:
778f1f3f +0b ntdll.dll    NtWaitForWorkViaWorkerFactory
765a3368 +10 kernel32.dll BaseThreadInitThunk

thread $b04:
778f1f3f +0b ntdll.dll    NtWaitForWorkViaWorkerFactory
765a3368 +10 kernel32.dll BaseThreadInitThunk

thread $8fc:
778f0156 +0e ntdll.dll               NtWaitForMultipleObjects
764315e3 +fa KERNELBASE.dll          WaitForMultipleObjectsEx
765a19f7 +89 kernel32.dll            WaitForMultipleObjectsEx
76a10864 +00 USER32.dll              MsgWaitForMultipleObjectsEx
76a10b64 +1a USER32.dll              MsgWaitForMultipleObjects
004abec1 +0d programm.exe       madExcept CallThreadProcSafe
004abf26 +32 programm.exe       madExcept ThreadExceptFrame
765a3368 +10 kernel32.dll            BaseThreadInitThunk
>> created by main thread ($5d4) at:
745578e1 +00 gdiplus.dll

thread $1750:
778f1f3f +0b ntdll.dll    NtWaitForWorkViaWorkerFactory
765a3368 +10 kernel32.dll BaseThreadInitThunk

cpu registers:
eax = 02d04d0c
ebx = 00000000
ecx = 08654e54
edx = 0018fd58
esi = 00290d72
edi = 00000000
eip = 0053004d
esp = 0018fd30
ebp = 0018fd50

stack dump:
0018fd30  e8 bf 67 00 fc fd 18 00 - b4 a4 40 00 50 fd 18 00  ..g.......@.P...
0018fd40  00 00 00 00 72 0d 29 00 - 00 00 00 00 0c 4d d0 02  ....r.)......M..
0018fd50  68 fd 18 00 32 15 54 00 - 1c 00 00 00 00 00 00 00  h...2.T.........
0018fd60  48 0c 00 00 00 00 00 00 - 94 fd 18 00 fa 62 a0 76  H............b.v
0018fd70  32 00 03 00 1c 00 00 00 - 00 00 00 00 48 0c 00 00  2...........H...
0018fd80  72 0d 29 00 cd ab ba dc - 00 00 00 00 00 00 00 00  r.).............
0018fd90  72 0d 29 00 0c fe 18 00 - 3a 6d a0 76 72 0d 29 00  r.).....:m.vr.).
0018fda0  32 00 03 00 1c 00 00 00 - 00 00 00 00 48 0c 00 00  2...........H...
0018fdb0  bd 53 e7 60 00 00 00 00 - 32 00 03 00 38 89 7f 08  .S.`....2...8...
0018fdc0  24 00 00 00 01 00 00 00 - 00 00 00 00 00 00 00 00  $...............
0018fdd0  30 00 00 00 ff ff ff ff - ff ff ff ff e9 6c a0 76  0............l.v
0018fde0  00 00 00 00 30 c1 44 01 - 00 00 00 00 00 00 00 00  ....0.D.........
0018fdf0  00 00 00 00 b0 fd 18 00 - 70 9a 44 01 58 fe 18 00  ........p.D.X...
0018fe00  1e a6 a6 76 e9 c0 5f 16 - 00 00 00 00 68 fe 18 00  ...v.._.....h...
0018fe10  e8 6d a0 76 00 00 00 00 - 72 0d 29 00 32 00 03 00  .m.v....r.).2...
0018fe20  1c 00 00 00 00 00 00 00 - 48 0c 00 00 d8 ec 91 01  ........H.......
0018fe30  01 00 00 00 d9 53 e7 60 - 38 5d 7f 08 00 00 00 00  .....S.`8]......
0018fe40  38 89 7f 08 86 58 06 75 - be 02 03 00 00 00 00 00  8....X.u........
0018fe50  34 fe 18 00 00 00 00 00 - b4 fe 18 00 1e a6 a6 76  4..............v
0018fe60  49 c0 5f 16 fe ff ff ff - a4 fe 18 00 44 6e a0 76  I._.........Dn.v

disassembling:
004093c8     public System.TObject.Free:     ; function entry point
004093c8 622   test   eax, eax
004093ca      jz     loc_4093d3
004093cc      mov    dl, 1
004093ce      mov    ecx, [eax]
004093d0     > call   dword ptr [ecx-4]
004093d3       ret

sakura 12. Okt 2017 08:42

AW: Zugriffsverletzung Adresse 0000000 beim beenden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist, wie schon vorher vermutet, mit sehr hoher Wahrscheinlichkeit die doppelte Freigabe eines Objektes. Installiere Dir FastMM4 - https://github.com/pleriche/FastMM4 - und binde dieses als erstes in Dein Projekt ein, kopiere die Debug-DLL (ist im Download enthalten) in das Anwendungsverzeichnis und ersetze mal die originale INC-Datei mit der aus dem Anhang hier. Dann solltest Du folgende Informationen am Ende erhalten:
  1. Wo wurde der Speicher das erste Mal reserviert
  2. Wann und wo wurde dieser wieder frei gegeben
  3. Wann wurde anschließend nochmals darauf zugegriffen - bzw. nochmals frei gegeben.

...:cat:...

generic 12. Okt 2017 16:15

AW: Zugriffsverletzung Adresse 0000000 beim beenden
 
In einer Unit im Finalization Teil wird ein Objekt erneut freigegeben.

Bezüglich der FastMM Konfiguration:
Ich verändere nie die Include-Datei sondern setze einfach "FullDebugMode" als Define (in den Projekt Optionen).


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