Нарушение прав доступа: попытка чтения или записи в защищенную память - PullRequest
6 голосов
/ 18 сентября 2011

У меня есть приложение winforms для c # (.net 4.0), которое работает почти каждый день, 8 часов в день, на XP SP 3. Большую часть времени он работает нормально, иногда месяцами. Затем кажется, что это плохо, и один раз в день, в течение нескольких дней подряд, в разное время, возникает исключение нарушения доступа. Я попытался просмотреть файл дампа и отловить исключение нарушения прав доступа для просмотра стека; в любом случае, я получаю почти такой же стек:

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)

Мне очень трудно это исправить, потому что трассировка стека не очень полезна. Во-первых, я даже не уверен, могу ли я доверять трассировке стека: попадает ли программа туда (похоже, она пытается отобразить некоторую подсказку, что, безусловно, возможно), потому что память уже повреждена или программа действительно должна быть законно там, но некоторая память данных повреждена. Во-вторых, предполагая, что трассировка стека верна и заслуживает доверия, я не вижу способа выяснить, что повреждает память ... Мы не делаем ничего последовательного, чтобы вызвать нарушение доступа ... Журнал приложения не показывает другие обнаруженные исключения до этого ... журналы событий не отображают никаких записей одновременно с нарушением доступа ... Есть ли какие-либо советы о том, как дополнительно диагностировать это?

Обновление 2011-10-11: я уже ловлю исключение, но вокруг метода Application.Run (). В этот момент кажется, что уже слишком поздно что-то делать. Просто на случай, если это исключение происходит из-за неисправного оборудования / драйвера и не указывает на то, что память приложения повреждена - есть ли еще место, где я мог бы перехватить исключение (и отобразить его, но затем позволить приложению продолжить)?

Обновление 2012-03-04: Я снова получил исключение, на этот раз после отображения довольно тривиальной формы (содержит только текстовое поле и кнопку ОК). Я использовал TextBox.AppendText (). Я просто случайно просмотрел этот комментарий одновременно. Может ли AppendText () вызвать проблему? Когда происходят «оригинальные» нарушения доступа, они имеют тенденцию происходить после отображения формы, содержащей richtextbox, в котором я также вызываю AppendText (). Сюжет сгущается!

Обновление 2012-03-06: я удалил AppendText и просто использовал вместо него TextBox.Text =, но сегодня я снова получил исключение нарушения доступа. Таким образом, AppendText не кажется виновником. Кроме того, исключение произошло однажды на устройстве dev, работающем под управлением Windows 7. Таким образом, не похоже, что это исключение относится к Windows XP или другому компьютеру (например, проблема с памятью).

Ответы [ 7 ]

5 голосов
/ 06 марта 2012

Мне удалось продублировать проблему благодаря этому сообщению . Таким образом, один обходной путь, по-видимому, отключает все всплывающие подсказки во всех представлениях данных, используя DataGridView.ShowCellToolTips = false; Однако это не идеально. Лучшее решение - позвонить

Application.EnableVisualStyles();

до создания каких-либо элементов управления в приложении .

Я подтвердил, что проблема возникает независимо от того, отображает ли DataGridView пользовательские подсказки (с CellToolTipTextNeeded) или нет.

3 голосов
/ 22 декабря 2011

Я наблюдал эту проблему при вызове сторонней оболочки C # для Cll.Я отключил DEP для C # dll, используя утилиту editbin.exe / NXCOMPAT: NO {dll name}, и это, похоже, устранило проблему.

Я должен делать дополнительные проверки CLR, когда DEP включенC dll может делать что-то, что CLR считает повреждением памяти и выдает эту ошибку.

Подробнее об этом можно прочитать по адресу http://blogs.msdn.com/b/ed_maurer/archive/2007/12/14/nxcompat-and-the-c-compiler.aspx

2 голосов
/ 13 декабря 2012

Недавно мы также получили AccessViolationException при выполнении TextBox.AppendText ().После попытки воспроизвести проблему, мы поняли, что TextBox не проблема.В нашем случае это была функция перетаскивания.

Вот минимальный проект (форма с TextBox), который будет воспроизводить исключение:

using System;
using System.Windows.Forms;

namespace TestTextBoxAccessViolation {
    public partial class Form1 : Form {


        public Form1() {
            InitializeComponent();
        }

        private void Form1_DragEnter(object sender, DragEventArgs e) {
            e.Effect = DragDropEffects.Copy;
        }

        private void Form1_DragDrop(object sender, DragEventArgs e) {
            e.Data.GetData("DragImageBits");
            Form1 f = new Form1();
            f.textBox1.Text = "Keep resizing this window and you'll get an AccessViolationException after a while";
            f.Show();
        }
    }
}

Вывод: не делайтеt использовать «DragImageBits».

1 голос
/ 09 октября 2014

Я обнаружил, что эта проблема возникает (сбой) не только в WPF, но и для WinForms.Моя проблема была связана с OpenFileDialog.Трудно сказать, что является источником проблемы, но все же кажется, что Microsoft DLL, связанная с OpenFileDialog, имеет ошибки (для меня это был ComDlg32.dll)

Единственный способ, которым я мог бы вызвать ShowDialog ()функция заключалась в том, чтобы обернуть его в событие и вызвать с помощью

this.BeginInvoke(
        new Action<YourObject, EventArgs>(YourObject_FileDialogOpened), new object[] 
                                                        { YourObjectInstance, e });

, где «this» - это элемент управления (например, Form).

BeginInvoke (...) предоставляетто, что вы звоните, будет обработано надлежащим образом.

Проблема не появится, если вы используете вызов OpenFileDialog под событием нажатия кнопки или любой другой подобный сценарий.

0 голосов
/ 22 июня 2014

Я страдал так же, как и ОП. Я пересмотрел часть программного обеспечения и добавил два метода PInvoke (для улучшения пользовательского интерфейса). К сожалению, я начал получать те же сообщения, что и ОП. Просматривая ответы, я нашел ответы Раджи Хиндустани. После комментирования двух методов PInvoke проблема, похоже, исчезла.

0 голосов
/ 25 сентября 2011

Это не легко отследить / исправить, так как вся информация довольно «общая», так что это несколько общих указателей:

  • Всегда ли это происходит на одной и той же машине?Если да, то, возможно, стоит проверить компьютер (тесты памяти и т. Д. Запускаются с загрузочного компакт-диска Linux или аналогичного) и / или запустить его на другом компьютере, чтобы проверить, не изменится ли он ...

  • Похоже, исключение возникает при отображении всплывающей подсказки ... может указывать на проблему с драйвером графической карты ... выберите другой драйвер и / или другое разрешение экрана и т. Д. И посмотрите, что произойдет

  • Вы используете сторонние библиотеки?Если это так, то стоит проверить их на наличие неуправляемых проблем с памятью (например, с помощью профилировщика памяти ...).Узнайте у поставщика (ов), есть ли более новые версии и т. Д.Некоторое время назад у меня было нечто подобное, и это оказалось неуправляемой утечкой памяти в какой-то сторонней библиотеке (диагностируется с помощью профилировщика памяти) ... Я проверил у поставщика и получил исправленную версию, которая с тех пор работает без сбоев ...

0 голосов
/ 18 сентября 2011

Не уверен, поможет ли это, но эта проблема, похоже, встречается в старых версиях .Net, и Microsoft даже выпустила некоторые исправления для этого.

Одно из первоначальных исправлений было следующим:

http://support.microsoft.com/kb/923028

Вот еще один. http://support.microsoft.com/kb/975954

...