2009-07-01 18 views
6

Mamy niedeterministyczne System.AccessViolationException wyrzucony z natywnego kodu. Trudno to odtworzyć, ale czasami się to zdarza. Nie jestem pewien, czy mogę "po prostu usunąć błąd", ponieważ czas potrzebny na naruszenie zasad dostępu wynosi około 2 godzin i nie ma gwarancji, że dojdzie do naruszenia zasad dostępu.Określić przyczynę System.AccessViolationException

Natywna biblioteka jest używana przez zarządzane opakowania. Jest używany od Javy przez JNI i jest używany od .NET do IKVM'ed JNI. Problem został odtworzony tylko z kodu IKVM, ale zestawy danych są inne i nie ma możliwości przetestowania aplikacji java z danymi używanymi przez aplikację IKVM.

Mam źródła wszystkiego, ale (jeśli to możliwe) chcę uniknąć wprowadzania dużej liczby zmian.

Wierzę, że macierzysty stos wywołań zapewni wystarczającą ilość informacji o przyczynie tego naruszenia zasad dostępu.

Czy istnieją skuteczne metody określania przyczyny tego naruszenia zasad dostępu?

Uważam, że idealnym rozwiązaniem dla mnie są pewne zmiany w kodzie lub środowisku procesowym, więc zawiesi się z zrzutem pamięci w przypadku tego naruszenia dostępu, więc mogę wprowadzić te zmiany i po prostu czekać.

Odpowiedz

2

Jeśli możesz sobie pozwolić na oczekiwanie na wystąpienie wyjątku, dołącz zarządzany i natywny debugger (mieszana sesja debugowania) i ustaw zarządzany debugger, aby złamał się po wygenerowaniu AccessViolationException. Zarządzany debugger złamie proces, gdy wykryje nieobsługiwany wyjątek, a następnie powinieneś zobaczyć natywny stos wywołań.

+0

Hm .. Zmieniłem swój kod macierzysty, więc na pewno ma on naruszenie zasad dostępu i przekompilował go za pomocą symboli debugowania. Kiedy rozpocząłem proces normalnie i zainstalowałem debuggera Visual Studio. Dodałem punkt przerwania do rzucania wyjątku AccessViolationException, ale nie został on przechwycony. Jakieś sugestie? – okutane

+1

OK, okaże się, że punkt przerwania powinien być naruszeniem dostępu do systemu Win32. – okutane

Powiązane problemy