Was sind einige Techniken für die auf einem Windows Mobile Gerät sehr intermittierende Zugriffsverletzung Fehlersuche?

StackOverflow https://stackoverflow.com/questions/402957

Frage

Ich habe eine große Compact Frameworks V2.0-Anwendung, die in den meisten Fällen sehr gut funktioniert. Auf bestimmten Geräten etwa einmal pro Tag erhält ein Benutzer eine Native Error 0xC0000005, die nicht mit dem Standard verwaltet Try / Catch-Block abgefangen wird.

Meine Anwendung synchronisiert mit dem Server über ASMX in festen Intervallen aufrufen. Das Problem tritt bei der Synchronisation auftreten. Es besteht ein erhebliches Geschäftslogik neben dem ASMX-Aufruf, der zum Zeitpunkt der Synchronisation geschieht, aber 98% davon ist Code verwaltet. Ich habe alle meine Bewertung P / Invokes und die Anwendungen native C ++ Bibliotheken und an diesem Punkt ist mir etwa 95% sicher, das ist nicht, wo das Problem ist.

Da dies geschieht nur auf bestimmte Geräte und sehr selten (weniger als einmal pro Tag), ist es sehr schwierig, zu isolieren. Ich habe meinen Code instruemented und es scheint, als ob es in zufälligen Stellen innerhalb der Anwendung geschieht, so vermute ich, etwas korrumpiert Speicher ist.

Alle Gedanken auf, wie dies zu beheben weiter geschätzt würde.

War es hilfreich?

Lösung 2

Meine native C ++ Ausnahmebehandlung wurde einschließlich nicht async Ausnahme und wurde somit kein Zugang zu kontrollieren Verletzung Ausnahmen.

Das kann / können für mein Problem nicht hilfreich sein, aber vielleicht für andere hilfreich sein.

Mit dem / EHa Schalter wie in diesem Link dokumentiert wird für den Fang dieser Art von Ausnahmen zulassen:

http://msdn.microsoft.com/en-us/library /1deeycx5.aspx

Andere Tipps

Ein 0XC0000005 ist eine Zugriffsverletzung, so wird etwas versucht, zu lesen oder zu einer Adresse schreiben, dass sie nicht über Zugriffsrechte auf. Diese neigen dazu, wirklich schwer zu finden, und die Erfahrung ist eines der besten Werkzeuge (gut Platform Builder Debugger ist wirklich sehr hilfsbereit, aber das ist eine ganz getrennte Allee von Debugging und erfordert Erfahrung, die Sie haben wahrscheinlich nicht oder würden Sie haben bereits Ich habe es versucht). Ich finde, dass die Protokollierung weniger nützlich zu sein scheint, dass subtraktiven Codierung -. Entfernen P / aufrufen Anrufe mit mock verwaltet Anrufe, wann immer möglich

Zugriffsverletzungen in verwalteten Anwendungen typischerweise für einen dieser Gründe haben:

  • Sie P / Invoke eine native API in einem Handgriff auf ein verwaltetes Objekt übergeben und die native API dass Griff verwendet. Wenn Sie eine Sammlung und Verdichtung erhalten, während die native API ausgeführt wird, kann das verwaltete Objekt bewegen, und der Zeiger wird ungültig.
  • Sie P / etwas mit einem Puffer Invoke, die zu klein ist oder kleiner als die Größe übergeben Sie und die API überwuchert eine Lese- oder Schreib
  • Ein Zeiger (IntPtr, etc) Sie zu einem P Pass / Invoke Aufruf ist ungültig (-1 oder 0) und die native prüft es nicht vor dem Gebrauch
  • Sie P / Invoke einen nativen Aufruf und der native Code läuft aus dem Speicher (in der Regel virtuell) und prüft nicht für gescheiterte Zuweisungen und liest / schreibt an eine ungültige Adresse
  • Sie verwenden einen GCHandle, die nicht initialisiert wird oder dass irgendwie verweisen auf ein bereits fertig gestellt und gesammelt Objekt (so zeigt es nicht auf ein Objekt, wird es auf eine Adresse zeigt, wo ein Objekt verwendet werden)
  • Ihre App verwenden einen Griff zu etwas, das von einem Schlaf / Wach für ungültig erklärt wurde. Dies ist eher esoterisches aber sicher passiert. Zum Beispiel, wenn Sie eine Anwendung ausgeführt wird von einer Speicherkarte aus, wird die gesamte App nicht in den Arbeitsspeicher geladen. Stück im Einsatz sind bedarfsausgelagert zur Ausführung. Das ist alles schön und gut. Nun, wenn Sie das Gerät ausschalten, die Fahrer alle herunterzufahren. Wenn Sie ein Backup Macht, die Speichergeräte viele Geräte einfach wieder montieren. Wenn Ihre App in mehr Programm zu verlangen-Seite braucht, dann ist es nicht mehr, wo er war, und es stirbt. Ein ähnliches Verhalten kann mit Datenbanken auf montiert speichert passieren. Wenn Sie ein offenes Handle auf die Datenbank haben, nach einem Schlaf / Wach-Zyklus der Verbindungs-Handle nicht mehr gültig sein kann.

Sie werden bemerken, den Trend hier, dass fast alle diese P / Invokes sind, und das ist kein Zufall. Es ist ziemlich schwierig, verwalteten Code zu bekommen dies allein zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top