Кто-нибудь сталкивался с нарушением отладчика INT 3 в mscorwks.dll?

Мы размещаем среду выполнения .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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
1 018
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Обсуждается аналогичная проблема здесь. Самая интересная часть заключается в следующем:

Mscorwks.dll is just the messenger. It is telling you that it detected a loaderlock. It is your code that caused it.

Черт, у нас есть DLL, которая, как мы знаем, вызывает блокировку загрузчика, которую мы не можем исправить. Хорошо, спасибо.

Lasse V. Karlsen 24.11.2008 13:19

Вы должны иметь возможность получить символы для mscorwks - у меня есть несколько версий, поэтому MS symserv определенно обслуживала их в прошлом.

Это может немного помочь понять, что происходит.

Судя по тому, что у вас есть трассировка в USER32.dll, я подозреваю, что у вас уже настроены некоторые символы, но если вы этого не сделаете, это может помочь: http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx

Я сам не использую Delphi, но я предполагаю, что он использует dbghelp.dll для работы с символами / PDB, поэтому его, вероятно, можно настроить с помощью symserv, даже если у него нет явного пользовательского интерфейса, который мог бы помочь.

Другие вопросы по теме