Что опять за хрень от Microsoft?
От: nen777w  
Дата: 11.01.12 21:10
Оценка:
Примерно пол года назад (когда сидел под WinXP) написал приложение под C# которое использует unmanaged dll.
Сейчас использую Windows7, cегодня приложение понадобилось. Запускаю и получаю:

Красным обведен вызов в unmanaged dll

Забегая вперёд (в дебагере), исключение происходит по возврату из функции в unmanaged dll:

An unhandled exception of type 'System.AccessViolationException' occurred in PuzzlePackMaker.exe
Additional information: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.


Тут пишут что это DEP и как его отключить.
Но что то не помогает.

Что ещё это может быть???


12.01.12 21:17: Перенесено модератором из 'О жизни' — VladD2
Re: Что опять за хрень от Microsoft?
От: UA Украина  
Дата: 11.01.12 21:24
Оценка:
Здравствуйте, nen777w, Вы писали:

Расстрел памяти, как результат попытка выполнения кода по невалидному указателю в unmanaged dll, который указывает в защищенную область памяти. Что вас собственно удивляет? Или вы свято верите что ваша unmanaged dll безбажная?
Re[2]: Что опять за хрень от Microsoft?
От: nen777w  
Дата: 11.01.12 21:39
Оценка:
Здравствуйте, UA, Вы писали:

UA>Здравствуйте, nen777w, Вы писали:


UA>Расстрел памяти, как результат попытка выполнения кода по невалидному указателю в unmanaged dll, который указывает в защищенную область памяти. Что вас собственно удивляет? Или вы свято верите что ваша unmanaged dll безбажная?


Никакого растерла там быть не может. Я же говорю что под XP это приложение работало отлично.

Вот код на C#:
public static string gen_uuid()
{
    string uuid_s = generate_uuid();
    free_uuid();
    return uuid_s;
}


и тот который в dll:

const char*    generate_uuid()
{
    p_uuid = new std::string;

    boost::uuids::random_generator    gen;
    boost::uuids::uuid new_uuid = gen();

    *p_uuid = boost::lexical_cast<std::string>(new_uuid);

    return p_uuid->c_str();
}
Re[3]: Что опять за хрень от Microsoft?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 11.01.12 21:44
Оценка:
Здравствуйте, nen777w, Вы писали:

p_uuid — статическая переменная?
зачем строку в динамической памяти создавать?
static std::string и все.

N>Вот код на C#:

N>
N>public static string gen_uuid()
N>{
N>    string uuid_s = generate_uuid();
N>    free_uuid();
N>    return uuid_s;
N>}
N>


N>и тот который в dll:


N>
N>const char*    generate_uuid()
N>{
N>    p_uuid = new std::string;

N>    boost::uuids::random_generator    gen;
N>    boost::uuids::uuid new_uuid = gen();

N>    *p_uuid = boost::lexical_cast<std::string>(new_uuid);

N>    return p_uuid->c_str();
N>}
N>
Маньяк Робокряк колесит по городу
Re[3]: Что опять за хрень от Microsoft?
От: UA Украина  
Дата: 11.01.12 21:45
Оценка:
Здравствуйте, nen777w, Вы писали:

После расстрела памяти ошибка может вылезать в самом неожиданном для вас месте, а причина ошибки будет реально находится в совсем другом месте.
Re[3]: Что опять за хрень от Microsoft?
От: abibok  
Дата: 11.01.12 22:13
Оценка: 37 (7) +12
N>
N>const char*    generate_uuid()
N>{
N>    p_uuid = new std::string;

N>    boost::uuids::random_generator    gen;
N>    boost::uuids::uuid new_uuid = gen();

N>    *p_uuid = boost::lexical_cast<std::string>(new_uuid);

N>    return p_uuid->c_str();
N>}
N>


Что творят... Аж зла не хватает, глядя на такое.
Re[4]: Что опять за хрень от Microsoft?
От: nen777w  
Дата: 11.01.12 22:42
Оценка:
Здравствуйте, UA, Вы писали:

UA>Здравствуйте, nen777w, Вы писали:


UA>После расстрела памяти ошибка может вылезать в самом неожиданном для вас месте, а причина ошибки будет реально находится в совсем другом месте.

да нет там никакого растерла, вылетает сразу же после первого вызова из unmanaged dll.
Re: Что опять за хрень от Microsoft?
От: VladFein США  
Дата: 11.01.12 22:42
Оценка: 1 (1) +4
Здравствуйте, nen777w, Вы писали:

N>Сейчас использую Windows7

64-bit?
А dll — 32-bit?
C# приложение строится для "Any CPU"?

"неверный формат" скорее всего означает попытку загрузить 32-bit модуль как 64-bit.
Пересоберите Ваш C# для x86, или сделайте dll 64-bit.
Re[2]: Что опять за хрень от Microsoft?
От: UA Украина  
Дата: 11.01.12 22:53
Оценка:
Здравствуйте, 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 упала бы скорее всего, а здесь по логу видно что какие то вызовы из нее выполняются.
Re[3]: Что опять за хрень от Microsoft?
От: VladFein США  
Дата: 11.01.12 23:04
Оценка:
Здравствуйте, UA, Вы писали:

UA>В таком случае LoadLibrary упала бы скорее всего, а здесь по логу видно что какие то вызовы из нее выполняются.


По словам ТС:
"Красным обведен вызов в unmanaged dll"
Не вижу что из нее выполнилось...
Re[3]: Что опять за хрень от Microsoft?
От: landerhigh Пират  
Дата: 11.01.12 23:49
Оценка: +1 :)
Здравствуйте, nen777w, Вы писали:

N>и тот который в dll:


N>
N>const char*    generate_uuid()
N>{
N>    // здесь хочется закричать "МАМА!"
N>}
N>



В качестве оценки тут требуется страшно напуганный смайлик.
www.blinnov.com
Re[4]: Что опять за хрень от Microsoft?
От: nen777w  
Дата: 12.01.12 00:21
Оценка: +1
L>В качестве оценки тут требуется страшно напуганный смайлик.
Код хреновый согласен. Но он работал именно поэтому я его и не правил. Теперь в Win7 не работает нормально целое приложение.
По теме будет что то (потому что варианты у меня уже закончились) или будем продолжать дублировать сообщения про плохой код?
Re[5]: Что опять за хрень от Microsoft?
От: landerhigh Пират  
Дата: 12.01.12 00:40
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Код хреновый согласен. Но он работал именно поэтому я его и не правил. Теперь в Win7 не работает нормально целое приложение.


Это — не хреновый код. Это просто ужас. Впору в Кунсткамере выставлять.

N>По теме будет что то (потому что варианты у меня уже закончились) или будем продолжать дублировать сообщения про плохой код?


По теме сказать нечего, потому что ни Microsoft, ни Win7 тут ни при чем. И, кстати, тебе очень повезло что и на XP этот "плохой код" в основном работает, а не винчестер форматирует.
www.blinnov.com
Re[6]: Что опять за хрень от Microsoft?
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 12.01.12 00:46
Оценка:
Здравствуйте, landerhigh, Вы писали:

L>По теме сказать нечего, потому что ни Microsoft, ни Win7 тут ни при чем. И, кстати, тебе очень повезло что и на XP этот "плохой код" в основном работает, а не винчестер форматирует.


Что-то не вижу в его коде UB.
Ce n'est que pour vous dire ce que je vous dis.
Re[6]: Что опять за хрень от Microsoft?
От: nen777w  
Дата: 12.01.12 00:49
Оценка:
N>>Код хреновый согласен. Но он работал именно поэтому я его и не правил. Теперь в Win7 не работает нормально целое приложение.
L>Это — не хреновый код. Это просто ужас. Впору в Кунсткамере выставлять.

Для студента писавшего его нормально. Тогда задача стояла быстро получить результат не до разглядывания кода было.

N>>По теме будет что то (потому что варианты у меня уже закончились) или будем продолжать дублировать сообщения про плохой код?

L>По теме сказать нечего, потому что ни Microsoft, ни Win7 тут ни при чем.
L>И, кстати, тебе очень повезло что и на XP этот "плохой код" в основном работает, а не винчестер форматирует.

Хэх, ну не знаю. Знаю только что это работало сам руками мацал, а теперь просто зла не хватает.
Re[7]: Что опять за хрень от Microsoft?
От: landerhigh Пират  
Дата: 12.01.12 01:05
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Что-то не вижу в его коде UB.


В приведенном фрагменте и правда, нет. Но хорошо бы еще код free_uuid() посмотреть тогда уж.
www.blinnov.com
Re[7]: Что опять за хрень от Microsoft?
От: landerhigh Пират  
Дата: 12.01.12 01:09
Оценка: +1
Здравствуйте, nen777w, Вы писали:

L>>Это — не хреновый код. Это просто ужас. Впору в Кунсткамере выставлять.


N>Для студента писавшего его нормально. Тогда задача стояла быстро получить результат не до разглядывания кода было.


Мне вот интересно, инженеров-строителей в институте тоже учат стоить быстро в угоду качеству?

N>>>По теме будет что то (потому что варианты у меня уже закончились) или будем продолжать дублировать сообщения про плохой код?

L>>По теме сказать нечего, потому что ни Microsoft, ни Win7 тут ни при чем.
L>>И, кстати, тебе очень повезло что и на XP этот "плохой код" в основном работает, а не винчестер форматирует.

N>Хэх, ну не знаю. Знаю только что это работало сам руками мацал, а теперь просто зла не хватает.


Злись на себя. Правда, теперь ты знаешь, что такое technical debt и как больно от него бывает.

Кстати, код free_uuid можно в студию?
www.blinnov.com
Re[8]: Что опять за хрень от Microsoft?
От: nen777w  
Дата: 12.01.12 01:14
Оценка:
N>>Хэх, ну не знаю. Знаю только что это работало сам руками мацал, а теперь просто зла не хватает.
L>Злись на себя. Правда, теперь ты знаешь, что такое technical debt и как больно от него бывает.
Да это херотень какая то а не technical debt. Ушел спать завтра буду искать XP с дебагером, нужно ущипнуть себя что это не сон был когда оно работало.

L>Кстати, код free_uuid можно в студию?


Наслаждайтесь

void        free_uuid()
{
    if( p_uuid ) delete p_uuid;
    p_uuid = NULL;
}


Я могу ещё с других проектов понабрасывать сюда, но какой смысл в этом?
Re[3]: Что опять за хрень от Microsoft?
От: Олег К.  
Дата: 12.01.12 01:46
Оценка:
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-битную. Код пофиксить не было возможности.
Re[9]: Что опять за хрень от Microsoft?
От: landerhigh Пират  
Дата: 12.01.12 01:58
Оценка: 4 (2) +4
Здравствуйте, nen777w, Вы писали:

N>Да это херотень какая то а не technical debt. Ушел спать завтра буду искать XP с дебагером, нужно ущипнуть себя что это не сон был когда оно работало.


L>>Кстати, код free_uuid можно в студию?


N>Наслаждайтесь


N>
N>void        free_uuid()
N>{
N>    if( p_uuid ) delete p_uuid;
N>    p_uuid = NULL;
N>}
N>


Ну, так я и думал.
Во-первых, ты организовал себе минное поле. Просто добавь многопоточности немножко и оно будет падать и на XP.
Во-вторых, сдается мне, что грабли тут отрастают из-за того, что ты неправильно маршалишь строку в управляемый код. Я бы делал вот так.
Я не знаю деталей того, как именно System::String работает, но КМК тут вполне может иметь место быть lazy копирование. Которое выполняется, когда ты возвращаешь строку из gen_uuid(). А к этому времени твоя unmanaged строка уже качественно так убита вышеприведенным кодом. Просто семерка с большей вероятностью помечает соответствующую область памяти как недоступную и дает тебе по рукам. На XP вероятность этого заметно ниже.

Твой код — это как красная тряпка. Возвращается указатель на динамически создаваемый объект, при этом время его жизни и механизмы совершенно никак не обозначены. Рано или поздно это рванет. Лучше рано, иначе будешь потом через десять лет винить непричастных.
www.blinnov.com
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.