2010-02-23 1 views
4

Я получаю нарушение доступа в DBEXPSDA40.DLL (Dev Art MS SQL Server dbexpress) при закрытии моего приложения .NET. Мое приложение (VB.NET) вызывает Delphi написанный COM-сервер, который использует dbexpress для подключения к SQL Server.Как .NET-программа ведет себя по-разному при запуске и без отладки в Visual Studio?

Если я делаю то же самое, но мое приложение-хост является родным приложением Delphi или Excel VBA, то я не вижу A/V. Я также не вижу этого, если я запускаю приложение VB.NET в VS IDE с отладкой.

Я разыскал A/V в пункте финализации в блоке DBEXPRESS, который заботится о закрытии драйверов (в данном случае два, один для сервера SQL, а другой для SQL Server Compact)

Если я смогу понять, в чем разница между отладкой и отсутствием в среде .NET, я, возможно, знаю, где искать дальше.

+0

AV может быть скрыт, но это не значит, что он не существует. Как вы его проверяете? – Torbins

+0

Я могу отслеживать (в Delphi) через финализацию, а дескриптор драйвера (указатель) действителен, когда он работает, а не когда он не – Steve

ответ

1

Ваша разница в структуре памяти.

Существует много тонких факторов, которые влияют на процесс. Во-первых, в отладчике JIT генерирует несколько другой код (для размещения отладчика). В зависимости от настроек вашего отладчика Visual Studio может также вводить в ваш процесс другой код (например, .vshost.exe). Отладчик также может влиять на время и, в свою очередь, может выставлять условия гонки и/или изменять распределение памяти.

Короче говоря, к моменту закрытия приложения вы получаете [немного или значительно] разную структуру памяти. Очевидно, что это касается и другого хост-приложения.

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

И этот адрес просто находится на нераспределенной странице памяти в одном случае, но, случается, он находится в выделенном случае в других случаях (потому что макет памяти отличается, помните?). И в последнем случае dbexpress просто считывает значение из памяти, что-то делает с ним, видимо, доволен результатом и изящно выходит.

Это (наряду с непревзойденными условиями гонки) является очень распространенной проблемой с незрело написанным неуправляемым кодом (который, как показывает мой опыт, очень часто встречается в случае, когда Delphi участвует).

Решение? Измените условия. Вы можете попробовать другие устройства. Или на той же машине, но при большой нагрузке. Или загрузите еще несколько модулей. Или не загружайте некоторые модули, которые вы обычно делаете. Играть с этим.

Это, как говорится, по-настоящему лично так не идет. Он просто ищет булавку в стоге сена, никогда не заканчивая, эмоционально истощая приключение. Кроме того, у вас есть высокая вероятность получить AV в другом месте (но из-за одной и той же основной причины).

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

В противном случае я бы начал с очень тщательного обзора кода для компонента Delphi.И, возможно, отладка также будет напечатана.

Удачи.

0

Возможно, приложение-хозяин скрывает от вас исключение. Ошибки выключения сложнее. Добавьте несколько журналов, чтобы узнать, произошло ли исключение при отладке отладчика.

+0

Я уверен, что хост-приложение не скрывает ошибку, Я могу отлаживать dll автоматизации в Delphi, а строка нарушения подходит, когда я запускаю хост с отладкой, но не тогда, когда я запускаю его за пределами VS. – Steve