Примерно пол года назад (когда сидел под WinXP) написал приложение под C# которое использует unmanaged dll.
Сейчас использую Windows7, cегодня приложение понадобилось. Запускаю и получаю:
Красным обведен вызов в unmanaged dll
Забегая вперёд (в дебагере), исключение происходит по возврату из функции в unmanaged dll:
An unhandled exception of type 'System.AccessViolationException' occurred in PuzzlePackMaker.exe
Additional information: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
Расстрел памяти, как результат попытка выполнения кода по невалидному указателю в unmanaged dll, который указывает в защищенную область памяти. Что вас собственно удивляет? Или вы свято верите что ваша unmanaged dll безбажная?
Здравствуйте, UA, Вы писали:
UA>Здравствуйте, nen777w, Вы писали:
UA>Расстрел памяти, как результат попытка выполнения кода по невалидному указателю в unmanaged dll, который указывает в защищенную область памяти. Что вас собственно удивляет? Или вы свято верите что ваша unmanaged dll безбажная?
Никакого растерла там быть не может. Я же говорю что под XP это приложение работало отлично.
Здравствуйте, UA, Вы писали:
UA>Здравствуйте, nen777w, Вы писали:
UA>После расстрела памяти ошибка может вылезать в самом неожиданном для вас месте, а причина ошибки будет реально находится в совсем другом месте.
да нет там никакого растерла, вылетает сразу же после первого вызова из unmanaged dll.
Здравствуйте, VladFein, Вы писали:
VF>Здравствуйте, nen777w, Вы писали:
N>>Сейчас использую Windows7 VF>64-bit? VF>А dll — 32-bit? VF>C# приложение строится для "Any CPU"?
VF>"неверный формат" скорее всего означает попытку загрузить 32-bit модуль как 64-bit. VF>Пересоберите Ваш C# для x86, или сделайте dll 64-bit.
В таком случае LoadLibrary упала бы скорее всего, а здесь по логу видно что какие то вызовы из нее выполняются.
L>В качестве оценки тут требуется страшно напуганный смайлик.
Код хреновый согласен. Но он работал именно поэтому я его и не правил. Теперь в Win7 не работает нормально целое приложение.
По теме будет что то (потому что варианты у меня уже закончились) или будем продолжать дублировать сообщения про плохой код?
Здравствуйте, nen777w, Вы писали:
N>Код хреновый согласен. Но он работал именно поэтому я его и не правил. Теперь в Win7 не работает нормально целое приложение.
Это — не хреновый код. Это просто ужас. Впору в Кунсткамере выставлять.
N>По теме будет что то (потому что варианты у меня уже закончились) или будем продолжать дублировать сообщения про плохой код?
По теме сказать нечего, потому что ни Microsoft, ни Win7 тут ни при чем. И, кстати, тебе очень повезло что и на XP этот "плохой код" в основном работает, а не винчестер форматирует.
Здравствуйте, landerhigh, Вы писали:
L>По теме сказать нечего, потому что ни Microsoft, ни Win7 тут ни при чем. И, кстати, тебе очень повезло что и на XP этот "плохой код" в основном работает, а не винчестер форматирует.
N>>Код хреновый согласен. Но он работал именно поэтому я его и не правил. Теперь в Win7 не работает нормально целое приложение. L>Это — не хреновый код. Это просто ужас. Впору в Кунсткамере выставлять.
Для студента писавшего его нормально. Тогда задача стояла быстро получить результат не до разглядывания кода было.
N>>По теме будет что то (потому что варианты у меня уже закончились) или будем продолжать дублировать сообщения про плохой код? L>По теме сказать нечего, потому что ни Microsoft, ни Win7 тут ни при чем. L>И, кстати, тебе очень повезло что и на XP этот "плохой код" в основном работает, а не винчестер форматирует.
Хэх, ну не знаю. Знаю только что это работало сам руками мацал, а теперь просто зла не хватает.
Здравствуйте, nen777w, Вы писали:
L>>Это — не хреновый код. Это просто ужас. Впору в Кунсткамере выставлять.
N>Для студента писавшего его нормально. Тогда задача стояла быстро получить результат не до разглядывания кода было.
Мне вот интересно, инженеров-строителей в институте тоже учат стоить быстро в угоду качеству?
N>>>По теме будет что то (потому что варианты у меня уже закончились) или будем продолжать дублировать сообщения про плохой код? L>>По теме сказать нечего, потому что ни Microsoft, ни Win7 тут ни при чем. L>>И, кстати, тебе очень повезло что и на XP этот "плохой код" в основном работает, а не винчестер форматирует.
N>Хэх, ну не знаю. Знаю только что это работало сам руками мацал, а теперь просто зла не хватает.
Злись на себя. Правда, теперь ты знаешь, что такое technical debt и как больно от него бывает.
N>>Хэх, ну не знаю. Знаю только что это работало сам руками мацал, а теперь просто зла не хватает. L>Злись на себя. Правда, теперь ты знаешь, что такое technical debt и как больно от него бывает.
Да это херотень какая то а не technical debt. Ушел спать завтра буду искать XP с дебагером, нужно ущипнуть себя что это не сон был когда оно работало.
L>Кстати, код free_uuid можно в студию?
N>>>Сейчас использую Windows7 VF>>64-bit? VF>>А dll — 32-bit? VF>>C# приложение строится для "Any CPU"?
VF>>"неверный формат" скорее всего означает попытку загрузить 32-bit модуль как 64-bit. VF>>Пересоберите Ваш C# для x86, или сделайте dll 64-bit.
UA>В таком случае LoadLibrary упала бы скорее всего, а здесь по логу видно что какие то вызовы из нее выполняются.
Я бы тоже битность проверил. Были похожие проблемы на 64-битной семерке. Фиксилось сменой ОСи на 32-битную. Код пофиксить не было возможности.
Здравствуйте, nen777w, Вы писали:
N>Да это херотень какая то а не technical debt. Ушел спать завтра буду искать XP с дебагером, нужно ущипнуть себя что это не сон был когда оно работало.
L>>Кстати, код free_uuid можно в студию?
N>Наслаждайтесь
N>
Ну, так я и думал.
Во-первых, ты организовал себе минное поле. Просто добавь многопоточности немножко и оно будет падать и на XP.
Во-вторых, сдается мне, что грабли тут отрастают из-за того, что ты неправильно маршалишь строку в управляемый код. Я бы делал вот так.
Я не знаю деталей того, как именно System::String работает, но КМК тут вполне может иметь место быть lazy копирование. Которое выполняется, когда ты возвращаешь строку из gen_uuid(). А к этому времени твоя unmanaged строка уже качественно так убита вышеприведенным кодом. Просто семерка с большей вероятностью помечает соответствующую область памяти как недоступную и дает тебе по рукам. На XP вероятность этого заметно ниже.
Твой код — это как красная тряпка. Возвращается указатель на динамически создаваемый объект, при этом время его жизни и механизмы совершенно никак не обозначены. Рано или поздно это рванет. Лучше рано, иначе будешь потом через десять лет винить непричастных.