AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherzugriffsfehler

Ein Thema von derula · begonnen am 16. Mär 2008 · letzter Beitrag vom 16. Mär 2008
Antwort Antwort
Seite 1 von 2  1 2      
derula

Registriert seit: 16. Mär 2008
11 Beiträge
 
Delphi 7 Personal
 
#1

Speicherzugriffsfehler

  Alt 16. Mär 2008, 02:00
Moin.

Ich habe gerade einen immer wieder rekonstruierbaren Fehler, der scheinbar nicht in meinem Code auftritt.

Wiefolgt: meine DLL (im folgenden als "ich" bezeichnet) exportiert eine Initialisierungs- und eine Deinitialisierungsfunktion. Die Anwendung (im folgenden "es", nicht von mir entwickelt) ruft die eine beim Starten, die andere beim Beenden auf. So weit, so gut.

Nun kommt es aber manchmal, dass Es meine Deinit. auch zur Laufzeit aufruft und später wieder die Init. Das funktioniert immer noch. Aber danach ruft es eine weitere Funktion meiner DLL auf. Die läuft durch, kann ich im Debugger schrittweise verfolgen. Er kommt bis zum abschließenden "end;" dieser Funktion. Klicke ich nun nochmal auf Einzelschritt, kommt folgender Fehler:

Zitat:
access violation at 0+0012fb96: read of address 0x00120001
und ein "CPU"-Fenster tut sich auf. Ich habe mit IDA einen Debug-Trace angefertigt, ab dem letzten möglichen Source-Haltepunkt (denke ich zumindest, es müsste die retn-Anweisung der zugehörigen Funktion sein) bis zu der Exception:

Code:
00001D10 CODE:HarmonyInitWave+44         retn                HarmonyInitWave returned to rpg2000.exe:0050C457
00001D10 rpg2000.exe:0050C457            retn                returned to Stack[00001D10]:0012FB94
00001D98                                                      ST0= 1.041310961582891512e-2504 ST1= 0.0 ST2= 8.0616745606685941392e-2505 ST3= 3.5949607961044423618e3498 ST4= 0.0 ST5= 1.0 ST6= 1.0 ST7= 4.8770310000000001828e6 CTRL=1372 CS=1B DS=23 ES=23 FS=3B GS=0 SS=23 EAX=12FAC4 EBX=BE26E4 ECX=FFFFFFFE EDX=DA2240 ESI=BEFCA8 EDI=BEDF28 EBP=12FADC ESP=12FAD4 EFL=200282
00001D98 CODE:HarmonyInitWave+37         retn                ESP=12FAD8
00001D98 CODE:HarmonyInitWave:loc_DA222F mov al, [ebp+var_1] EAX=12FA01
00001D98 CODE:HarmonyInitWave+42         pop ecx            ECX=1000000 ESP=12FADC
00001D98 CODE:HarmonyInitWave+43         pop ebp            EBP=12FB5C ESP=12FAE0
00001D98 CODE:HarmonyInitWave+44         retn                ESP=12FAE4
00001D98 CODE:HarmonyInitWave+44         retn                HarmonyInitWave returned to rpg2000.exe:0050C457
00001D98 rpg2000.exe:0050C457            retn                ESP=12FAE8
00001D98 rpg2000.exe:0050C457            retn                returned to Stack[00001D98]:0012FB94
00001D98 Stack[00001D98]:0012FB94        aam 0FDh           EAX=120001 SF=0
00001D98 0012FB96                                             EFL=210302 TF=1 RF=1
Kann damit jemand etwas anfangen? Ich nämlich nicht.

Wenn man bei geworfener exception in Delphi das Programm weiterlaufen lässt kommt wieder derselbe Fehler an derselben Stelle. Lässt man es ohne Debugger laufen, beendet sich einfach die Host-Anwendung. Die Deinitialisierungsmethode gibt alle in der Init. createten Resourcen wieder frei. (Wenn man beide Funktionen komplett leert, tritt derselbe Fehler auf.)

Ich hoffe mir kann jemand hier helfen. Wenn ihr mehr Informationen braucht, sagt bescheid.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Speicherzugriffsfehler

  Alt 16. Mär 2008, 02:05
Puh, das ist schwer nachzuvollziehen. Eine AV bekommt man in der Regel, wenn auf Speicher zugegriffen wird, der ungültig ist. Also du gibst zum Beispiel Speicher frei und danach wird wieder daraufzugegriffen. Hast du irgendwie Zugriff auf den Code von "Es"?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
derula

Registriert seit: 16. Mär 2008
11 Beiträge
 
Delphi 7 Personal
 
#3

Re: Speicherzugriffsfehler

  Alt 16. Mär 2008, 02:17
Zitat von Luckie:
Hast du irgendwie Zugriff auf den Code von "Es"?
Nein, leider nicht. Ich ersetze eine DLL, die normalerweise damit geliefert wird, und bei der tritt das Problem nicht auf. Es hat schonmal jemand anders so eine Ersatz-DLL geschrieben und der hatte das Problem auch nicht.

Also ich greife eigentlich auf nix zu was schon freigegeben ist. Ich meine, wie gesagt, wenn ich die Funktionen ganz leer mache, also gar nix initialisiere und auch nix lösche, tritt immer noch derselbe Fehler auf.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Speicherzugriffsfehler

  Alt 16. Mär 2008, 10:05
Herzlich willkommen in der Delphi-PRAXiS, derula.

Bei dem Versuch, die Harmony.dll von deinem RPGMaker zu ersetzen, könntest du die falschen Aufrufkonventionen für deine DLL-Funktionen verwendet haben.

Hast du dir schon alle notwendigen Informationen zu deinem Projekt besorgt?

Harmony Library
PowerBasic Downloads

Grüße vom marabu
  Mit Zitat antworten Zitat
derula

Registriert seit: 16. Mär 2008
11 Beiträge
 
Delphi 7 Personal
 
#5

Re: Speicherzugriffsfehler

  Alt 16. Mär 2008, 15:27
Zitat von marabu:
Herzlich willkommen in der Delphi-PRAXiS, derula.
Erstmal danke =)

Zitat von marabu:
Bei dem Versuch, die Harmony.dll von deinem RPGMaker zu ersetzen, könntest du die falschen Aufrufkonventionen für deine DLL-Funktionen verwendet haben.

Hast du dir schon alle notwendigen Informationen zu deinem Projekt besorgt?
Informationen habe ich von Ineluki, Aufrufkonvention stdcall, funktioniert bei seinem MP3-Patch ja ganz gut. Ich ähm... weiß jetzt nicht so ganz was ich mit dem Link anfangen soll, aber ich verstehe das jetzt mal so: die RM harmony.dll benutzt diese Harmony Library? Also es ist auf jeden Fall nicht dasselbe, da die RM dll und HarmLib ganz andere Funktionen drin haben. Ist die RM Harmony dann mit PowerBasic compiliert? O.o Weil der Rest von RM ist ja Delphi...

Danke jedenfalls für die Links.

Edit: und wie gesagt funktioniert alles, außer wenn man aus dem RM raus das Spiel startet und dann wieder beendet.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Speicherzugriffsfehler

  Alt 16. Mär 2008, 15:50
Hallo,

wegen deiner Geheimniskrämerei musste ich mir erst ein paar Hintergrundinfos besorgen und bin auf RPGMaker und die mitgelieferte Harmony.dll gestoßen. An anderer Stelle fand ich dann Hinweise darauf, dass Harmony.dll bei älternen Versionen beigepackt ist, bei neueren nicht mehr benutzt wird. Als Autor von Harmony.dll wurde auf eine Nachfrage Prof Raes ausgedeutet, deshalb der erste Link. Wegen der dort fehlenden oder nicht sofort ersichtlichen technischen Infos habe ich den zweiten Link hinzugefügt. Vergiss beide Links, wenn sie nichts mit deinem Problem zu tun haben.

Die beiden Projekte von ineluki habe ich zwar auch entdeckt, aber auch dort auf die Schnelle nichts entdeckt und weil ineluki auf eine ältere Frage von einem Hilfesuchenden nicht direkt geantwortet hat, sondern um private Kontaktaufnahme bat, habe ich weitere Recherchen eingestellt.

Wenn du unsicher bist, ob du eine function in deiner eigenen Harmony.dll korrekt implementiert hast, dann stelle die funktionierende Funktion von ineluki und deine Implementierung hier online. Nur so kann hier jemand ohne viel Aufwand sehen, wo der Fehler steckt. Da du geschrieben hast, dass auch eine Dummy-Funktion zu dem Fehler führt, habe ich auf die Verwendung einer falschen Aufrufkonvention geschlossen.

Freundliche Grüße
  Mit Zitat antworten Zitat
derula

Registriert seit: 16. Mär 2008
11 Beiträge
 
Delphi 7 Personal
 
#7

Re: Speicherzugriffsfehler

  Alt 16. Mär 2008, 16:14
Sorry wegen der Geheimniskrämerei. Hab gedacht es wäre einfacher euch Details zu ersparen ^^'... Ich hab jetzt auch die Referenz auf die Harmony Library gefunden, aber RPG Maker's harmony.dll ist sicher Delphi-compiliert... vielleicht gabs ne ältere Version von HL auch für Delphi?

Ich hab auch deshalb keine Details gesagt, weil man zum Nachvollziehen den RPG-Maker und das RTP installieren muss. Und ich weiß gar nicht ob man den noch irgendwo herkriegt.

Meine | Inelukis

Meine ist relativ groß, weil sie noch Debug-Informationen enthält.

Also, ich hab wirklich alles durchprobiert was ich für möglich hielt, aber hat alles nicht geholfen.

Also falls es weiterhilft, meine DLL verwendet DSMixer von Carlos Barbadosa und damit DirectX, Teile der Audio Tools Library und somit implizit auch TNT Unicode.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Speicherzugriffsfehler

  Alt 16. Mär 2008, 18:40
Die DLL's helfen nur jemandem, der den RPGMaker installiert hat.

Ich weiß nicht wie du vorgegangen bist, aber ich würde zuerst eine DLL entwerfen, die alle Funktionsaufrufe an die Original-DLL durchreicht. Wenn die funktioniert kannst du deinen Init- und DeInit-Code einhängen. Bist du so vorgegangen?

Freundliche Grüße
Angehängte Dateien
Dateityp: zip harmony_205.zip (1,7 KB, 1x aufgerufen)
  Mit Zitat antworten Zitat
derula

Registriert seit: 16. Mär 2008
11 Beiträge
 
Delphi 7 Personal
 
#9

Re: Speicherzugriffsfehler

  Alt 16. Mär 2008, 18:59
Zitat von marabu:
Ich weiß nicht wie du vorgegangen bist, aber ich würde zuerst eine DLL entwerfen, die alle Funktionsaufrufe an die Original-DLL durchreicht.
Hab grade so eine DLL gebastelt: Genau derselbe Fehler ^^ scheint wohl ein Bug in Delphi (7 Personal) zu sein? Werde mal Ineluki fragen, welche Delphi-Version er verwendet hat.

Sorry, dass ich darauf nicht vorher gekommen bin, trotzdem danke für die Hilfe! Tolle Community hier.

(Ich hab den Fehler in früheren Versionen meiner DLL gar nicht bemerkt, ich dachte, den hätte ich irgendwann eingebaut, aber wenn nichtmal diese Dummy-DLL funktioniert, wird bei meiner der Bug wohl auch schon immer drin gewesen sein...)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Speicherzugriffsfehler

  Alt 16. Mär 2008, 19:19
An einen Fehler in Delphi mag ich nicht glauben. Wenn die Aufruf-Konvention korrekt ist, dann tippe ich auf die beiden Funktionen mit dem String-Parameter.

BTW: Bei meiner substitute dll habe ich die Importe aus Nodtveidts Demo zugrunde gelegt. Auch wenn ich bei der Adaption keinen Fehler gemacht zu haben glaube, so kann doch die BASIC-Vorlage fehlerhaft sein. Wenn ich das richtig sehe, dann hat auch Ineluki bei Nodtveidth abgeguckt. Vielleicht ist er auf Fehler gestoßen?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:46 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