Zufällige Zugriffsverletzungen in meinem Code

8

Ich habe modifiziert, debuggen, modifizieren, debuggen (Sie kennen den Drill) und ich kann einfach nicht herausfinden, was diese Zugriffsverletzungen verursacht!

Am typischsten ist " Lesen der Adresse 80000000 " in der Skype4COM.dll, aber ich vermute nicht, dass es der Code ist, der das verursacht.

Mein erster Verdacht war, dass ich zu viele Befehle an die Skype-API (über Skype4COM) gesendet habe, aber nachdem ich einige Pausenlogik hinzugefügt hatte, um sicherzustellen, dass Skype und das COM-Objekt mithalten konnten, wurde mir klar, dass das nicht stimmte - Es passiert immer noch!

Ich benutze Threads, um dies zu tun, und sogar ohne Verwendung von Threads provoziert es immer noch einen AV. (Ich verwende nur einen Thread auf einmal)

Hier ist meine Thread Execute-Methode:

%Vor%

Die Zugriffsverletzung tritt in der Mitte des gesamten Prozesses auf - ich weiß, denn wenn es am Ende wäre, wäre die Fortschrittsleiste, die den Fortschritt anzeigt, voll, und das ist es nicht, es liegt normalerweise bei 10-80%.

Das ErrMsg (); ist im Grunde nur eine MessageDlg Routine, also würde ich nicht alle mbOk und so Zeug machen müssen.

Das Protokoll (); fügt den Fehler zu meinem Log-Memo hinzu.

Wenn Sie weitere Informationen benötigen, zögern Sie nicht zu fragen!

EDIT: Ich habe vergessen zu erwähnen, dass das Debuggen etwas schwierig ist, weil das AV auf meinem Client-PC stattfindet, nicht auf meinem. Ich werde versuchen, jede verdächtige Aktion zu protokollieren, indem ich Log (); vor / nach jeder verdächtigen Linie.

EDIT2: Ich habe es gerade auf dem PC eines anderen Kumpels getestet, und sein Werk funktioniert einwandfrei. Ich habe ein paar Tester, und es ist wie 50% von ihnen, die die AVs berichtet ..

Hier ist eines der madExcept Logs:

%Vor%

EDIT 3: Nachdem ich jede Codezeile protokolliert habe, habe ich festgestellt, dass der Gauner die CreateChatWith.SendMessage -Zeile ist! Was schlägst du vor?

EDIT 4: Alles klar, durch die Aufteilung von CreateChatWith und SendMessage war es die SendMessage , die das verursacht!

Danke!

    
Jeff 30.03.2011, 19:59
quelle

4 Antworten

5

Ihre Ausnahmebedingungsnachricht ist wahrscheinlich etwas wie "Zugriffsverletzung bei Adresse XXXXXXX. Blablabla". Notieren Sie sich diese Adresse und platzieren Sie einen Haltepunkt irgendwo in Ihrer Execute-Methode. Wenn die Ausführung an diesem Haltepunkt stoppt, wählen Sie "Fehler suchen" aus dem Menü (unter Bearbeiten oder etwas) und geben Sie die Adresse ein. Sie werden jetzt zu dem Code springen, bei dem der Fehler aufgetreten ist.

Wenn es irgendwo in Ihrer Execute-Methode ist, teilen Sie uns bitte mit, welche Zeile es ist. Außerdem würde ich vorschlagen, dass Sie etwas wie MadExcept verwenden, um Ihre Ausnahmen einschließlich eines Stack-Trace zu protokollieren.

Wenn Sie nicht wissen, wie Sie eine DLL mit dem Delphi-Debugger debuggen können

Nach dem Lesen Ihres Posts vermute ich, dass Sie nicht wissen, wie man eine DLL mit Delphi debuggt (nichts für ungut). So machen Sie es:

  • Beenden Sie Skype
  • Setzen Sie in Ihren Projektoptionen "TD32-Info einbeziehen", legen Sie "Entfernte Debugging-Symbole hinzufügen" fest (ich bin mir nicht sicher, aber es tut nicht weh)
  • Neu erstellen
  • Öffnen Sie "Debugger Options", stellen Sie sicher, dass "Stop on Delphi exceptions" aktiviert ist
  • Öffnen Sie "Parameter ausführen"
  • Setzen Sie die Host-Anwendung auf Skype.exe
  • Drücken Sie F9, Skype startet jetzt
  • Wenn Ihre DLL von Skype geladen wird, erscheinen blaue Punkte in Ihrem Code. Sie können auch Haltepunkte setzen.
  • Wenn der Fehler auftritt, stoppt der Debugger in der Zeile, in der der Fehler aufgetreten ist.
The_Fox 30.03.2011 20:40
quelle
1

Da es nicht genug Informationen gibt, um genau zu wissen, werde ich eine Wette annehmen. Ich wette, die AVs kommen von diesen Zugriffen auf die lokale Variable User :

%Vor%

Ich vermute, dass der Typ von User ein Zeigertyp ist, der durch die Typdeklaration angegeben wird:

%Vor%

Ich vermute, dass diese Besetzung:

%Vor%

ist etwas, das nicht wirklich vom selben Typ ist. Bei der Umwandlung wird keine Validierung durchgeführt, der Compiler versucht glücklicherweise, die Struktur des deklarierten Typs über den Speicher, auf den gezeigt wird, zu schichten. Die Probleme treten auf, wenn Sie versuchen, sich auf Elemente dieser Struktur zu beziehen, und das tatsächliche Layout dessen, was im Speicher vorhanden ist, stimmt nicht ganz überein.

Wenn Sie diesen Code durchgehen und die Daten bei jedem Schritt überprüfen könnten, sollte es sehr einfach sein, den Fehler zu finden, vorausgesetzt, dass dies bereits passiert, wenn I klein ist.

Es gibt andere hier, die besser erraten können, als ich es kann. Takers?

    
Caleb Hattingh 30.03.2011 20:24
quelle
1
  

EDIT 3: Nach dem Loggen jeder Zeile von   Code, fand ich, dass der Gauner der ist   CreateChatWith.SendMessage-Zeile! Was   schlagen Sie vor?

Ich würde diese Zeile teilen

%Vor%

in zwei oder mehr:

%Vor%

um den fehlerhaften Code weiter zu identifizieren.

    
mjn 04.04.2011 14:50
quelle
0

Wenn Sie alles in Ihrem Code dreifach überprüft haben, dann vergleichen Sie die Pascal-Header-Implementierung von SendMessage () für Skype DLL mit C-Headern und suchen Sie nach einem Fehler in der Header-Übersetzung. Was Sie über SendMessage () senden, muss 100% entsprechen, was erwartet wird.

    
avra 05.04.2011 07:54
quelle