Прошу прощения, если пост слишком длинный, но я был бы счастлив, если бы кто-нибудь хотя бы указал на прочтение выделенных жирным шрифтом заголовков и указал мне правильное направление. У меня уже несколько дней возникает эта проблема, но я не могу найти ответ в сети. Это то, что я выяснил до сих пор.
1. Исключение нарушения прав доступа приводит к сбою моего управляемого приложения
Приложение My C # WinForms иногда закрывается с исключением нарушения доступа (попытка чтения или записи в защищенную память) прямо в момент выбора TabPage в форме окна TabControl. Из трассировки стека (попробуйте / поймайте Application.Run) я вижу, что исключение происходит в System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
, вызываемом внутри UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
.
-- Message: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. -- Stack trace: at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) at System.Windows.Forms.Application.ComponentManager .System.Windows.Forms.UnsafeNativeMethods .IMsoComponentManager.FPushMessageLoop (Int32 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(ApplicationContext context) at MyApp.Program.Main()
2. Сбойный модуль кажется COM-объектом (ChartFX Client Server 6.2)
Используя WinDbg (с загруженным SoS), я поймал его на неуправляемой стороне, внутри ChartFX.ClientServer.Core.dll (это компонент построения диаграмм COM, который мы используем):
(ca84.c98c): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=00000000 ebx=06e67c38 ecx=06e67c38 edx=000018c6 esi=06e7df30 edi=317a9e80 eip=31666110 esp=0015e040 ebp=0015e08c iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010246 ChartFX_ClientServer_Core!Ordinal5507+0x97b7: 31666110 8a404d mov al,byte ptr [eax+4Dh] ds:0023:0000004d=??
[edit:] Мне также не удалось получить неподтвержденные данные стека из WinDbg (там говорилось, что информация о раскручивании стека недоступна):
0:000> kP ChildEBP RetAddr WARNING: Stack unwind information not available. Following frames may be wrong. 0015e08c 3166288b ChartFX_ClientServer_Core!Ordinal5507+0x97b7 0015e394 3165a921 ChartFX_ClientServer_Core!Ordinal5507+0x5f32 0015e480 31678685 ChartFX_ClientServer_Core!Ordinal5496+0x26a 0015e568 3167bef4 ChartFX_ClientServer_Core!Ordinal5492+0x975 0015e668 316a356b ChartFX_ClientServer_Core!Ordinal5492+0x41e4 0015e77c 31709496 ChartFX_ClientServer_Core!Ordinal443+0x5745 0015e7d0 31707f70 ChartFX_ClientServer_Core!Ordinal2584+0x3cdc 0015e7f8 3170817d ChartFX_ClientServer_Core!Ordinal2584+0x27b6 0015e81c 3162fd76 ChartFX_ClientServer_Core!Ordinal2584+0x29c3 0015e86c 7719f8d2 ChartFX_ClientServer_Core!Ordinal899+0x6b6 0015e898 7719f794 USER32!GetMessageW+0x93 0015e910 771a06f6 USER32!GetWindowLongW+0x115 0015e940 771a069c USER32!CallWindowProcW+0x75 0015e960 747fcef4 USER32!CallWindowProcW+0x1b 0015e97c 747fd073 comctl32!Ordinal377+0x5c 0015e9e0 747fd027 comctl32!DefSubclassProc+0x92 0015ea04 747fd4e6 comctl32!DefSubclassProc+0x46 0015ea20 747fd073 comctl32!DefSubclassProc+0x505 0015ea84 747fd118 comctl32!DefSubclassProc+0x92 0015eae4 7719f8d2 comctl32!DefSubclassProc+0x137
3. Ошибка непросто воспроизвести (хотя обычно ее можно спровоцировать менее чем за 5 минут).
У меня есть несколько экземпляров Chart на нескольких страницах вкладок, и обычно это происходит, когда я переключаю вкладки. Я до сих пор не знаю, как его воспроизвести, кроме переключения этих вкладок за несколько минут до того, как это произойдет, поэтому я не могу использовать наш исходный элемент управления, чтобы надежно найти сборку, в которой не было этой проблемы. Я получаю доступ к диаграммам через управляемый класс-оболочку AxChart (производный от AxHost), который был автоматически создан дизайнером VS.
4. Что мне делать дальше?
Если бы кто-нибудь мог указать мне, какой следующий шаг я должен сделать, чтобы найти настоящую причину, я был бы очень благодарен. Эксперименты (удаление и возврат кода) не принесут много пользы, потому что я не знаю, как его воспроизвести, поэтому на каждой итерации потребуется много времени, чтобы убедить себя, что ошибка все еще существует.
Я обнаружил, что люди часто предлагают что-то вроде переключения оптимизаций компилятора, но поскольку исключение не генерируется детерминированно, я не хочу просто переставлять некоторые байты и надеяться, что оно никогда не вернется.