Отладка .NET - System.Threading.ExecutionContext.runTryCode - PullRequest
5 голосов
/ 18 марта 2010

У нас есть эта ошибка, которая появляется только в 30% случаев для сборки выпуска. Открытие аварийного дампа в WinDbg (перерезанный вывод "! Analysis -v"):

FAULTING_IP: 
+4
00000000`00000004 ??              ???

EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 0000000000000004
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 0000000000000008
   Parameter[1]: 0000000000000004
Attempt to execute non-executable address 0000000000000004
ERROR_CODE: (NTSTATUS) 0xc0000005 - 
   The instruction at 0x%08lx referenced memory at 0x%08lx. 
   The memory could not be %s.
WRITE_ADDRESS:  0000000000000004 
MANAGED_STACK: 
(TransitionMU)
0000000024B9E370 000007FEEDA1DD38 
   mscorlib_ni!
   System.Threading.ExecutionContext.runTryCode(System.Object)+0x178
(TransitionUM)
(TransitionMU)
0000000024B9DFB0 000007FF00439010 MyLibrary!DocInfo.IsStatusOK()+0x30

Теперь IsStatusOK () просто вызывает PrintSystemJobInfo.Get () , но, похоже, это даже не появляется в стеке.

Есть идеи, как это отладить? Я уверен, что runTryCode () действительно не проблема ... но .. Я застрял.

Спасибо! (Я действительно нащупываю здесь).

Ответы [ 3 ]

0 голосов
/ 28 марта 2010

Нарушение прав доступа должно происходить из собственного кода, поэтому либо структуры данных, идущие вниз, ошибочны, либо что-то в определении может быть ошибочным. Вы p-вызываете собственные методы вызова или отправляете структуры данных другим управляемым методам, которые вызывают собственные методы?

Что касается упомянутых потоков, является ли этот код многопоточным? Возможно ли, что у вас возникла проблема с потоками, когда структуры данных, которые вы используете для связи с собственным кодом, повреждены другими потоками?

0 голосов
/ 29 марта 2010

Спасибо всем! Наконец-то разобрался.

Здесь происходит некоторое внутреннее взаимодействие, и GC, очевидно, перемещается по некоторым переменным в памяти. Это тот, который сеет хаос на стороне Interop. Решение: используйте IntPtr или GCHandle.Alloc ()

(по общему признанию, этот ответ был написан в спешке, я постараюсь заполнить правильный ответ, когда у меня будет время).

0 голосов
/ 26 марта 2010

Удар в темноте - но, учитывая, что это, возможно, связано с печатью, может ли оно быть вызвано изворотливым драйвером принтера?

Проблема возникает на разных машинах или только на определенных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...