Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stelle der Zugriffsverletzung finden (https://www.delphipraxis.net/132806-stelle-der-zugriffsverletzung-finden.html)

Viktorii 20. Apr 2009 09:03


Stelle der Zugriffsverletzung finden
 
Hallo zusammen.

Ich habe mir eine DLL geschrieben mit der ich auf ein USB Gerät zugreifen kann. Desweiteren habe ich mir eine Software geschrieben welche diese DLL benutzt.

Jetzt bekomme ich unter ganz bestimmten (reproduzierbaren) Umständen eine Zugriffsverletzung:

Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt xyz.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 037B0000. Lesen von Adresse 037B0000' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Die Adresse variiert natürlich. Ich habe leider keine Ahnung woran das liegt, bzw. an welcher Stelle im meinem Code der Fehler liegen könnte. Ich weiß nichtmals ob das Problem in meiner DLL oder in meiner Applikation liegt.

Wie kann herausbekommen wo der Fehler liegt :?:

Vielen Dank

Bernhard Geyer 20. Apr 2009 09:08

Re: Stelle der Zugriffsverletzung finden
 
Debug-Infos aktivieren und JCLDebug-Units der Jedi Code Library verwenden.
Falls es "nur" doppelte Freigaben von Strings wären würde auch FastMM mit aktiver Logausgabe reichen.

oki 20. Apr 2009 09:14

Re: Stelle der Zugriffsverletzung finden
 
oder einfach das Projekt der DLL laden, die Anwendung die die DLL nutzt zur Projektgruppe hinzufügen, die Anwendung aus der IDE heraus ausführen und mit dem Debugger durchgehen. Der sollte dann auch den Code deiner DLL mit abarbeiten.

Gruß oki

Viktorii 20. Apr 2009 10:30

Re: Stelle der Zugriffsverletzung finden
 
Zitat:

Zitat von Bernhard Geyer
Debug-Infos aktivieren und JCLDebug-Units der Jedi Code Library verwenden.

Habe jcl-1.104.1.3248 heruntergeladen und auch installiert. Aber wie verwende ich die JCLDebug-Units nun?




Zitat:

Zitat von Bernhard Geyer
Falls es "nur" doppelte Freigaben von Strings wären würde auch FastMM mit aktiver Logausgabe reichen.

Denke das sieht nicht danach aus, oder?

Zitat:

---------------------------
BF533SourceControl.exe: Memory Leak Detected
---------------------------
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):

5 - 12 bytes: Unknown x 1

69 - 84 bytes: TWorkThread x 1

Note: Memory leak detail is logged to a text file in the same folder as this application. To disable this memory leak check, undefine "EnableMemoryLeakReporting".

---------------------------
OK
---------------------------




Zitat:

Zitat von oki
oder einfach das Projekt der DLL laden, die Anwendung die die DLL nutzt zur Projektgruppe hinzufügen, die Anwendung aus der IDE heraus ausführen und mit dem Debugger durchgehen. Der sollte dann auch den Code deiner DLL mit abarbeiten.

Gruß oki

Da die Kommunikation Timeouts enthält, geht durchsteppen leider nicht.

Bernhard Geyer 20. Apr 2009 10:50

Re: Stelle der Zugriffsverletzung finden
 
Zitat:

Zitat von Viktorii
Habe jcl-1.104.1.3248 heruntergeladen und auch installiert. Aber wie verwende ich die JCLDebug-Units nun?

Schau dir die entsprechend mitgelieferten Beispiele zu den JCLDebug-Units an (Demo-Unterverzeichnis Debug)

oki 20. Apr 2009 11:00

Re: Stelle der Zugriffsverletzung finden
 
Zitat:

Da die Kommunikation Timeouts enthält, geht durchsteppen leider nicht.
Dann setze BreakPoints und schau vorher, wo der Debugger mit der Exception anhält. So kannst du dich trotz Timeouts an die Fehlerquelle herantasten.
Nach der Exception kannst du ja in der IDE auf Anhanlten gehen und der Cursor steht dann auf der Zeile die die Exception geworfen hat, auch in deiner DLL. Das das in einem laufenden Datenstream u.U. mühsam ist will ich nicht bestreiten. In der Regel schreibe ich ein eigenes Log bei solchen Vorgängen mit. Da lasse ich dann auch die Exceptions mit protokollieren.

Gruß oki


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