Мы размещаем среду выполнения .NET как часть программы Win32, и в последнее время она начала постоянно ломаться по определенному адресу в mscorwks.dll.
По указанному адресу находится байт 0xCC, который является инструкцией INT 3, запускающей отладчик.
Кто-нибудь еще видел это?
Я не вижу достаточно информации в dll, чтобы точно знать, где она, функция или источник, но ее определенно нет ни в одной из наших библиотек.
Стек вызовов выглядит так (это из Delphi 2007):
:7a04f02a ; C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
:7a052fc6 ; C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
:7a053e72 ; C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
:7a03b970 ; C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
:7a00351e ; C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
:7a0255e0 ; C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
:79e71e6d ; C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
:7e42b372 USER32.MoveWindow + 0xd4
:7e4565b7 USER32.GetRawInputDeviceInfoW + 0x5f
:7e42ce7c USER32.SetLayeredWindowAttributes + 0x6a
Адрес, по которому происходит сбой, - 0x7A04F029, разборка в памяти выглядит так:
7A04F020 call $7a14be35
7A04F025 cmp [esi],ebx
7A04F027 jz $7a04f02a
7A04F029 int 3 <-- here's the culprit
7A04F02A mov byte ptr [ebp-$04],$02
7A04F02E lea ecx,[ebp-$00000224]
7A04F034 call $79e82214
От этого достаточно легко избавиться, просто каждый раз исправляйте этот байт в памяти с помощью 0x90 (NOP), но при следующем запуске отладчика dll, конечно же, перезагружается.
У меня есть половина разума попытаться исправить сам файл, но я тоже не уверен, что это хорошая идея. Я проверил, что байт CC является частью dll, нашел окружающий шаблон байтов с помощью шестнадцатеричного редактора.
Есть какие-нибудь советы, как это исправить? Кто-нибудь еще видел это?
Как упоминалось в ответах, это была проблема с LoaderLock. Библиотека DLL, которая была построена в Win32, должна была предоставлять несколько функций для нашей системы .NET таким образом, чтобы она не была привязана к тому, как мы размещаем среду выполнения .NET. Проект включал в себя несколько модулей, содержащих функции, которые должны были быть представлены, но, к сожалению, также было добавлено много-много кода, который был полезен в приложении, но не для этой DLL.
Разделение необходимых мне функций уменьшило размер DLL с 7 МБ до примерно 100 КБ, а также избавилось от LoaderLock.





Обсуждается аналогичная проблема здесь. Самая интересная часть заключается в следующем:
Mscorwks.dll is just the messenger. It is telling you that it detected a loaderlock. It is your code that caused it.
Вы должны иметь возможность получить символы для mscorwks - у меня есть несколько версий, поэтому MS symserv определенно обслуживала их в прошлом.
Это может немного помочь понять, что происходит.
Судя по тому, что у вас есть трассировка в USER32.dll, я подозреваю, что у вас уже настроены некоторые символы, но если вы этого не сделаете, это может помочь: http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx
Я сам не использую Delphi, но я предполагаю, что он использует dbghelp.dll для работы с символами / PDB, поэтому его, вероятно, можно настроить с помощью symserv, даже если у него нет явного пользовательского интерфейса, который мог бы помочь.
Черт, у нас есть DLL, которая, как мы знаем, вызывает блокировку загрузчика, которую мы не можем исправить. Хорошо, спасибо.