Ich habe Probleme mit einer Speicherzugriffsausnahme in einer VB.NET-Anwendung, an der ich arbeite. Ich hoffte hier einige Einblicke zu bekommen, da keine meiner Recherchen mir geholfen haben, das Problem zu identifizieren.
Hintergrund:
Ich konvertiere eine Reihe von Anwendungen von VB6 auf .NET 4.0. Auf Wunsch des Kunden führe ich eine reine Konvertierung durch und refakturiere nur, wenn es notwendig ist, um andere Probleme im Code zu vermeiden, während ich konvertiere. Die meisten Apps werden im Modus Any CPU kompiliert, obwohl einige als x86 kompiliert werden müssen aufgrund der Abhängigkeit von 32-Bit-PLC-Software oder älteren Hardware-Treibern. Mein Entwicklungsrechner läuft unter Windows 7 64-Bit.
Problem:
Nach erfolgreicher Konvertierung von zwei Apps stürzt die dritte Anwendung an zufälligen Stellen im Code ab. Die Ausnahme wird nicht abgefangen und ich muss mir das genauer ansehen. Im Ereignisprotokoll sehe ich die Ausnahme-Code: 0xc0000005 auf ntdll.dll, was ich glaube, dass eine Speicherzugriffsausnahme ist. Da die Anwendung nicht immer am selben Ort abstürzt, ist es schwierig zu verfolgen. Ich habe bemerkt, dass viele Fehler bei Aufrufen von ADODB auftreten (nicht immer am selben Ort oder beim selben Aufruf), aber es ist auch bei Aufrufen von form.ShowDialog() abgestürzt.
Das Formular, in dem ShowDialog aufgerufen wird, schreibt einige Protokollinformationen in die DB mit ADODB. Obwohl ich es nicht bestätigen konnte, vermute ich, dass die Ausnahme innerhalb des form.ShowDialog() während eines dieser ADODB-Aufrufe auftritt. Die Abstürze bei den ADODB-Anrufen treten in Assemblys auf, die in den anderen beiden konvertierten Apps erfolgreich verwendet werden, und sie stürzen nicht konsistent am selben Ort ab.
In meinen Recherchen zu diesem Thema habe ich gesehen, dass eine schlechte Interoperation dieses Problem verursachen kann. Ich frage mich, ob die ADODB-COM-Aufrufe auf irgendeine Weise das Problem in dieser App verursachen, obwohl diese Aufrufe in den anderen Apps in Ordnung sind.
Einige der Stellen, an denen ich festgestellt habe, dass offensichtlich eine Ausnahme im Ereignisprotokoll ausgelöst wird:
- Erstellung eines ADODB.Recordset
- Erstellen eines neuen Parameters innerhalb eines Command.Append
- Verbindungsoffen-Aufrufe
Hätte jemand Ideen, wie ich dies eingrenzen kann, um möglicherweise das Problem auf die Wurzel zurückzuführen? Ich freue mich über jede Hilfe oder jeden Einblick, den Sie bereitstellen können.
0 Stimmen
Hast du die Möglichkeit ausgeschlossen, dass du Hardware-Probleme auf deinem Entwicklung Computer hast?
0 Stimmen
Ich habe mir die Hardware nicht direkt angesehen, aber ich habe die vorherige App erneut getestet, die dieselben Aufrufe und Assemblys auf dieser Maschine verwendet, um sicherzustellen, dass sie keine Probleme hatte. Außerdem greift der Code dieser bestimmten App nicht direkt auf die Hardware zu. Ich werde daran arbeiten, dass dies auf einer anderen Entwicklermaschine läuft, um es zu überprüfen.
0 Stimmen
Wissen Sie, auf welcher Original-Betriebssystemversion es lief? Vielleicht könnten Sie versuchen, es im Kompatibilitätsmodus für dieses Betriebssystem auszuführen oder zumindest ein älteres Betriebssystem ausprobieren. Klicken Sie mit der rechten Maustaste auf exe, Registerkarte Kompatibilität, aktivieren Sie "Dieses Programm im Kompatibilitätsmodus ausführen" und wählen Sie das Betriebssystem aus.
0 Stimmen
Um zu bestätigen, dass das Problem mit ADODB zusammenhängt, habe ich einige Bereiche überarbeitet, in denen es regelmäßig abstürzte, und der Absturz (zumindest in diesen Bereichen) hat aufgehört. Also werde ich im Grunde genommen eine SQLClient-Version dieser Assemblys für diese App erstellen, während ich die Original-Assemblys weiterhin separat für die anderen beiden Apps behalte. Falls jemand noch andere Ideen zur Ursache des Problems hat, höre ich sie gerne.