Опция компилятора "Оптимизация кода" для приложений под AutoCAD

Автор Тема: Опция компилятора "Оптимизация кода" для приложений под AutoCAD  (Прочитано 7130 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Уважаемые коллеги! Подскажите, пожалуйста, используете эту оптимизацию или нет? Если используете или использовали ранее, были ли какие-то проблемы из-за этого? Может быть, где-то есть рекомендации на этот счёт от Autodesk? Мне пока не удалось найти что-то толковое по этому вопросу в гугле.


Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
На сколько я могу судить - эта опция ни коем случаем не может повлиять на работу плагина в автокаде

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
В debug отключена, в release включена. Разницы в глюках не наблюдаю...

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Использую для сбора статистики вызовов команд.
Код - C# [Выбрать]
  1. caller = new StackTrace().GetFrame(1).GetMethod();
Если включить оптимизацию, то StackTrace пустой будет.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
На сколько я могу судить - эта опция ни коем случаем не может повлиять на работу плагина в автокаде
А есть понимание, что делает эта опция? Я не могу найти даже толкового описания, какие действия с кодом выполняются, если она включена.
В debug отключена, в release включена. Разницы в глюках не наблюдаю...
Я правильно понимаю, что отладку ведёте в Debug, а окончательную сборку в Release и проблем никогда не было?

Я почему озадачился этим вопросом. Вчера пересобирал большое решение с созданием отдельных проектов для каждой версии AutoCAD и не стал отключать эту оптимизацию в конфигурации Release. Сегодня при финальном тестировании готового приложения в пользовательском режиме регулярно ловил фатальную ошибку при изменении объекта на чертеже дополнительными ручками. А вот в режиме отладки как я ни старался - ошибки не было. Единственная разница между сборками - только в этой галочке. Снял её, пересобрал - ошибка пропала. По крайней мере, воспроизвести её у меня не получилось. Вот и гадаю: то ли это случайное совпадение, то ли оптимизация может как-то испортить работу приложения?

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Есть большая разница из под отладчика запускать или чистый Автокад. Какие-то нестабитьности при неспешной отладке пропадают. Фаталы на диспозе объектов чертежа, например. Особенно если по шагам отлаживать. Но я все-таки не думаю что это связано именно с оптимизацией .Net-кода. Скорее просто сборщик мусора в другие моменты срабатывает. Отключать галочку в релизе я пытался - ни разу не спасало.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
В общем, пришёл к выводу, что именно оптимизация нарушает работу приложения.
Сделал две сборки с разницей только в том, что у одной включена оптимизация, а у второй - отключена. Всё остальное идентично. Тестировал в режиме пользователя, без Visual Studio (без отладки). Оптимизированная валит AutoCAD стабильно в течении минуты-двух при определённых манипуляциях. Неоптимизированную гонял теми же манипуляциями по 5 минут - ни разу не уронила AutoCAD. Пробовал раз 10, не меньше. Даже компьютер перезагружал для чистоты эксперимента.
Вот такие пироги.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Будем знать... Для полноты картины: какие функции/классы API под подозрением? Какие сообщения на прощание выдает Автокад? Не успевает обработчик исключений выдать свое окошко? Под отладчиком тот же эффект?

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Какие сообщения на прощание выдает Автокад? Не успевает обработчик исключений выдать свое окошко?
Сообщение - простое окошко фатальной ошибки без подробностей.
Под отладчиком тот же эффект?
Попробовал в режиме Debug поставить галочку оптимизации (дичь, конечно же, но почему бы и нет?). Ошибку словил. Но т.к. код в DLL оптимизирован, он отличается от кода в Visual Studio и значения переменных не посмотреть в момент возникновения ошибки. Вообще не факт, что ошибка именно в этой строке.


какие функции/классы API под подозрением?
Судя по месту возникновения ошибки и по трассировке стека, под подозрением Dispose для объекта Curve3d.



Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
А на вид абсолютно безобидный код... Ну да, DisposableWrapper.Dispose() - это как раз то место с которого все "случайные" креши и начинаются... А у вас там наверно при оптимизации using закрывается чутка раньше. Думаю, если б дуга где-то использовалась позже, то и фатала не было.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Вот такое окошко с ошибкой чаще всего появляется:

Иногда там Access Violation Reading, а иногда Access Violation Writing. С различными буковками-циферками.
А иногда вываливает такое окошко:

Попробовал выбрать "Отладить программу" (тоже, так себе затея - отладить acad.exe, но почему бы и не попробовать?), результат:

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
А на вид абсолютно безобидный код... Ну да, DisposableWrapper.Dispose() - это как раз то место с которого все "случайные" креши и начинаются... А у вас там наверно при оптимизации using закрывается чутка раньше. Думаю, если б дуга где-то использовалась позже, то и фатала не было.
Да тут сложно как-то идентифицировать точную причину. Да и сама ошибка сильно рандомно появляется. Иногда двух-трёх перемещений ручки у объекта достаточно, а иногда таскаешь эту ручку туда-сюда, поглядывая на часы в углу экрана: "ага, минута прошла... может в этот раз не выскочит ошибка, может она пропала? а не, вот она, родимая" :)

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Это-то все стандартно, привычно, стек с такими вызовами слово-в-слово каждый день вижу. Но вот что-бы оптимизация компилятора эту гадость вызывала - это явный не порядок и повод жаловаться в вышестоящие инстанции. Кстати, а версия Автокада влияет на ход лодки?

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Изначально пробовал в 2018 версии, сейчас потестировал в 2016:

Так что, думаю, версия роли не играет.
Возможно, тут играет роль то, что это не чистый AutoCAD, а Civil3D и работа идёт с его объектами, хоть и с помощью AutoCAD API. Как вариант, в чистом AutoCAD такой ошибки никогда не будет.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
В любом случае прецедент есть. Повод проверять и чинить API есть. И придется тестировать релиз также тщательно как debug. И проверять вариант с отключением оптимизации при подобных фаталах. Так что тема поднята более чем полезная.