2009-07-01 32 views
6

Chúng tôi đang có System.AccessViolationException không xác định được ném từ mã gốc. Thật khó để tái tạo nó, nhưng đôi khi nó xảy ra. Tôi không chắc chắn nếu tôi có thể "chỉ gỡ lỗi nó" vì thời gian cần thiết cho vi phạm truy cập là khoảng 2 giờ và không có đảm bảo rằng vi phạm truy cập sẽ xảy ra.Xác định lý do của System.AccessViolationException

Thư viện gốc được sử dụng bởi trình bao bọc được quản lý. Nó được sử dụng từ java thông qua JNI và nó được sử dụng từ .NET thông qua IKVM'ed JNI. Vấn đề chỉ được sao chép từ mã IKVM'ed, nhưng các tập dữ liệu khác nhau và không có cách nào để thử nghiệm ứng dụng java với dữ liệu được ứng dụng IKVM'ed sử dụng.

Tôi có nguồn cho mọi thứ, nhưng (nếu có thể), tôi muốn tránh thực hiện nhiều thay đổi.

Tôi tin rằng chồng cuộc gọi gốc sẽ cung cấp đủ thông tin về lý do vi phạm quyền truy cập này.

Có cách nào hiệu quả để xác định nguyên nhân của vi phạm truy cập này không? Tôi nghĩ rằng giải pháp lý tưởng cho tôi là một số thay đổi trong môi trường mã hoặc quá trình, vì vậy nó sẽ sụp đổ với kết xuất bộ nhớ trong trường hợp vi phạm truy cập này, vì vậy tôi có thể thực hiện thay đổi đó và chờ đợi.

Trả lời

2

Nếu bạn có thể đủ khả năng chờ đợi ngoại lệ xảy ra, hãy đính kèm trình gỡ rối gốc và được quản lý (phiên gỡ lỗi hỗn hợp) và đặt trình gỡ lỗi được quản lý để ngắt khi số AccessViolationException bị ném. Trình gỡ lỗi được quản lý sẽ phá vỡ quy trình khi phát hiện ngoại lệ chưa được xử lý và sau đó bạn có thể xem ngăn xếp cuộc gọi gốc.

+0

Hm .. Tôi đã thay đổi mã gốc để chắc chắn có vi phạm quyền truy cập và biên dịch lại bằng các biểu tượng gỡ lỗi. Khi tôi bắt đầu quá trình bình thường và đính kèm Visual Studio debugger. Tôi đã thêm một breakpoint cho ném AccessViolationException, nhưng nó đã không bị bắt. Bất kỳ đề xuất? – okutane

+1

OK, tôi thấy rằng điểm ngắt nên là vi phạm truy cập Win32. – okutane

Các vấn đề liên quan