Tôi có ứng dụng winforms aC# (.net 4.0) chạy khá nhiều mỗi ngày trong tuần, 8 giờ mỗi ngày, trên XP SP 3. Hoạt động tốt hầu hết thời gian , đôi khi trong nhiều tháng. Sau đó, nó dường như nhận được trong một chính tả xấu, và một lần một ngày, trong một vài ngày liên tiếp, tại các thời điểm khác nhau, một ngoại lệ vi phạm truy cập đi lên. Tôi đã thử nhìn vào tập tin dump, và bắt ngoại lệ vi phạm truy cập để nhìn vào ngăn xếp; một trong hai cách, tôi nhận được khá nhiều cùng một ngăn xếp:Vi phạm Truy cập: Đã cố gắng đọc hoặc viết bộ nhớ được bảo vệ
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.ToolTip.WndProc(Message& msg)
at System.Windows.Forms.ToolTip.ToolTipNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
Tôi đang gặp khó khăn khi sửa lỗi này vì theo dõi ngăn xếp không phải là rất hữu ích. Đầu tiên, tôi thậm chí không chắc chắn liệu tôi có thể tin tưởng dấu vết ngăn xếp không: chương trình có ở đó (có vẻ như nó đang cố hiển thị một số chú giải công cụ, điều này chắc chắn có thể) do bộ nhớ đã bị hỏng hoặc nếu chương trình thực sự hợp pháp ở đó, nhưng một số bộ nhớ dữ liệu bị hỏng. Thứ hai, giả sử theo dõi stack là chính xác và đáng tin cậy, tôi không thấy một cách để tìm ra những gì đang làm hỏng bộ nhớ ... Chúng tôi không làm bất cứ điều gì phù hợp để kích hoạt vi phạm truy cập ... Nhật ký ứng dụng không hiển thị bất kỳ các ngoại lệ bị bắt trước đó ... nhật ký sự kiện không hiển thị bất kỳ mục nhập nào cùng lúc với vi phạm truy cập ... Bất kỳ gợi ý nào về cách chẩn đoán thêm điều này?
Cập nhật 2011-10-11: Tôi đã bắt ngoại lệ, nhưng xung quanh phương thức Application.Run(). Tại thời điểm đó có vẻ như đã quá muộn để làm nhiều. Chỉ trong trường hợp ngoại lệ này xảy ra do phần cứng/trình điều khiển bị lỗi và không cho biết bộ nhớ của ứng dụng bị hỏng - sẽ có bất kỳ nơi nào khác mà tôi có thể bắt ngoại lệ (và hiển thị nó, nhưng sau đó để ứng dụng tiếp tục)?
Cập nhật 2012-03-04: Tôi lại có ngoại lệ, lần này sau khi hiển thị biểu mẫu khá nhỏ (chỉ chứa hộp văn bản và nút ok). Tôi đã sử dụng TextBox.AppendText(). Tôi chỉ tình cờ duyệt qua số điện thoại comment này cùng một lúc. AppendText() có thể gây ra sự cố không? Khi các vi phạm truy cập 'ban đầu' xảy ra, chúng có xu hướng xảy ra sau khi hiển thị biểu mẫu chứa richtextbox mà tôi cũng gọi là AppendText(). Các âm mưu dày!
Cập nhật 2012-03-06: Tôi đã xóa AppendText và chỉ sử dụng TextBox.Text = thay vào đó, nhưng tôi lại có ngoại lệ vi phạm truy cập một lần nữa. Do đó, AppendText dường như không phải là thủ phạm. Hơn nữa, ngoại lệ xảy ra một lần trên một hộp dev, chạy Windows 7. Vì vậy, nó không có vẻ như ngoại lệ là cụ thể cho Windows XP, hoặc máy tính khác (như một vấn đề bộ nhớ).
Bạn có đang thực hiện bất kỳ PInvoke nào trong ứng dụng của mình không? Nếu bạn đang có, nó có thể có giá trị trong khi bình luận rằng peice của mã ra (nếu có thể) để xem nếu nó làm cho bất kỳ diference. Ngoài ra, hãy xem http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/6adca20b-649f-41a4-8fa1-09534882d76c/ đặc biệt là câu trả lời từ "James Kovac" và "DejanR" . Có thể là một cái gì đó để làm với tối ưu hóa gỡ lỗi. – Raghu