Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Дмитрий Загорулькин от 13-03-2018, 17:31:45

Название: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: Дмитрий Загорулькин от 13-03-2018, 17:31:45
Уважаемые коллеги! Подскажите, пожалуйста, используете эту оптимизацию или нет? Если используете или использовали ранее, были ли какие-то проблемы из-за этого? Может быть, где-то есть рекомендации на этот счёт от Autodesk? Мне пока не удалось найти что-то толковое по этому вопросу в гугле.
(https://s13.postimg.org/4r48b0403/Optimize_Code.png) (https://postimg.org/image/4r48b0403/)
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: Александр Пекшев aka Modis от 13-03-2018, 17:34:57
На сколько я могу судить - эта опция ни коем случаем не может повлиять на работу плагина в автокаде
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: avc от 13-03-2018, 17:41:18
В debug отключена, в release включена. Разницы в глюках не наблюдаю...
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: Вильдар от 13-03-2018, 18:01:27
Использую для сбора статистики вызовов команд.
Код - C# [Выбрать]
  1. caller = new StackTrace().GetFrame(1).GetMethod();
Если включить оптимизацию, то StackTrace пустой будет.
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: Дмитрий Загорулькин от 13-03-2018, 18:16:04
На сколько я могу судить - эта опция ни коем случаем не может повлиять на работу плагина в автокаде
А есть понимание, что делает эта опция? Я не могу найти даже толкового описания, какие действия с кодом выполняются, если она включена.
В debug отключена, в release включена. Разницы в глюках не наблюдаю...
Я правильно понимаю, что отладку ведёте в Debug, а окончательную сборку в Release и проблем никогда не было?

Я почему озадачился этим вопросом. Вчера пересобирал большое решение с созданием отдельных проектов для каждой версии AutoCAD и не стал отключать эту оптимизацию в конфигурации Release. Сегодня при финальном тестировании готового приложения в пользовательском режиме регулярно ловил фатальную ошибку при изменении объекта на чертеже дополнительными ручками. А вот в режиме отладки как я ни старался - ошибки не было. Единственная разница между сборками - только в этой галочке. Снял её, пересобрал - ошибка пропала. По крайней мере, воспроизвести её у меня не получилось. Вот и гадаю: то ли это случайное совпадение, то ли оптимизация может как-то испортить работу приложения?
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: avc от 13-03-2018, 18:25:04
Есть большая разница из под отладчика запускать или чистый Автокад. Какие-то нестабитьности при неспешной отладке пропадают. Фаталы на диспозе объектов чертежа, например. Особенно если по шагам отлаживать. Но я все-таки не думаю что это связано именно с оптимизацией .Net-кода. Скорее просто сборщик мусора в другие моменты срабатывает. Отключать галочку в релизе я пытался - ни разу не спасало.
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: Дмитрий Загорулькин от 13-03-2018, 20:01:10
В общем, пришёл к выводу, что именно оптимизация нарушает работу приложения.
Сделал две сборки с разницей только в том, что у одной включена оптимизация, а у второй - отключена. Всё остальное идентично. Тестировал в режиме пользователя, без Visual Studio (без отладки). Оптимизированная валит AutoCAD стабильно в течении минуты-двух при определённых манипуляциях. Неоптимизированную гонял теми же манипуляциями по 5 минут - ни разу не уронила AutoCAD. Пробовал раз 10, не меньше. Даже компьютер перезагружал для чистоты эксперимента.
Вот такие пироги.
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: avc от 13-03-2018, 20:46:19
Будем знать... Для полноты картины: какие функции/классы API под подозрением? Какие сообщения на прощание выдает Автокад? Не успевает обработчик исключений выдать свое окошко? Под отладчиком тот же эффект?
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: Дмитрий Загорулькин от 13-03-2018, 21:25:21
Какие сообщения на прощание выдает Автокад? Не успевает обработчик исключений выдать свое окошко?
Сообщение - простое окошко фатальной ошибки без подробностей.
Под отладчиком тот же эффект?
Попробовал в режиме Debug поставить галочку оптимизации (дичь, конечно же, но почему бы и нет?). Ошибку словил. Но т.к. код в DLL оптимизирован, он отличается от кода в Visual Studio и значения переменных не посмотреть в момент возникновения ошибки. Вообще не факт, что ошибка именно в этой строке.
(https://s13.postimg.org/58382xj4j/Optimization_Error.png) (https://postimg.org/image/58382xj4j/)
(https://s13.postimg.org/snl58aalf/Optimization_Error1.png) (https://postimg.org/image/snl58aalf/)
какие функции/классы API под подозрением?
Судя по месту возникновения ошибки и по трассировке стека, под подозрением Dispose для объекта Curve3d.


Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: avc от 13-03-2018, 21:40:13
А на вид абсолютно безобидный код... Ну да, DisposableWrapper.Dispose() - это как раз то место с которого все "случайные" креши и начинаются... А у вас там наверно при оптимизации using закрывается чутка раньше. Думаю, если б дуга где-то использовалась позже, то и фатала не было.
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: Дмитрий Загорулькин от 13-03-2018, 21:48:55
Вот такое окошко с ошибкой чаще всего появляется:
(https://s13.postimg.org/dvl0ucm8j/Error_Window.png) (https://postimg.org/image/dvl0ucm8j/)
Иногда там Access Violation Reading, а иногда Access Violation Writing. С различными буковками-циферками.
А иногда вываливает такое окошко:
(https://s13.postimg.org/th2cef0sj/Error_Window1.png) (https://postimg.org/image/th2cef0sj/)
Попробовал выбрать "Отладить программу" (тоже, так себе затея - отладить acad.exe, но почему бы и не попробовать?), результат:
(https://s13.postimg.org/oietzzk5v/Error_Window1_Debug.png) (https://postimg.org/image/oietzzk5v/)
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: Дмитрий Загорулькин от 13-03-2018, 21:53:00
А на вид абсолютно безобидный код... Ну да, DisposableWrapper.Dispose() - это как раз то место с которого все "случайные" креши и начинаются... А у вас там наверно при оптимизации using закрывается чутка раньше. Думаю, если б дуга где-то использовалась позже, то и фатала не было.
Да тут сложно как-то идентифицировать точную причину. Да и сама ошибка сильно рандомно появляется. Иногда двух-трёх перемещений ручки у объекта достаточно, а иногда таскаешь эту ручку туда-сюда, поглядывая на часы в углу экрана: "ага, минута прошла... может в этот раз не выскочит ошибка, может она пропала? а не, вот она, родимая" :)
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: avc от 13-03-2018, 21:54:54
Это-то все стандартно, привычно, стек с такими вызовами слово-в-слово каждый день вижу. Но вот что-бы оптимизация компилятора эту гадость вызывала - это явный не порядок и повод жаловаться в вышестоящие инстанции. Кстати, а версия Автокада влияет на ход лодки?
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: Дмитрий Загорулькин от 13-03-2018, 22:05:36
Изначально пробовал в 2018 версии, сейчас потестировал в 2016:
(https://s13.postimg.org/bi3336fhf/Error_Window_Ac2016.png) (https://postimg.org/image/bi3336fhf/)
Так что, думаю, версия роли не играет.
Возможно, тут играет роль то, что это не чистый AutoCAD, а Civil3D и работа идёт с его объектами, хоть и с помощью AutoCAD API. Как вариант, в чистом AutoCAD такой ошибки никогда не будет.
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: avc от 13-03-2018, 22:17:03
В любом случае прецедент есть. Повод проверять и чинить API есть. И придется тестировать релиз также тщательно как debug. И проверять вариант с отключением оптимизации при подобных фаталах. Так что тема поднята более чем полезная.
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: Александр Ривилис от 14-03-2018, 00:09:58
Думаю, что это не проблема AutoCAD/C3D API. Оптимизация - это перетасовка кода. В C++ есть ряд опций для оптимизации и часть из них может быть рекомендована, часть категорически не приветствуется - я на пустом месте получал фаталы. В C# нет описания того, как выполняется оптимизация. Вполне возможно, что в ряде случаев она работает некорректно. Например, компилятор C# понятия не имеет о том, что AutoCAD API должно выполнятся только в основном потоке и сборщик мусора тоже должен работать в этом же потоке. Или нельзя менять местами какие-то циклы. Или еще что-то подобное...
Название: Re: Опция компилятора "Оптимизация кода" для приложений под AutoCAD
Отправлено: Дмитрий Загорулькин от 21-11-2018, 18:03:10
(https://i.postimg.cc/G4NwR93j/b685836s-960-1.jpg) (https://postimg.cc/G4NwR93j)
Почти весь день я потратил на то, что пытался понять, почему у меня вылетает Civil с фатальной ошибкой при редактировании объекта кастомной ручкой. Причём, только в 2019 версии. Причём, только если приложение установлено. Из отладки - проблем нет. И только сейчас я заметил эту галочку в настройках Release проекта для 2019 версии и вспомнил, что уже однажды бился над такой проблемой.
Просто эта галочка автоматически ставится в конфигурации Release при создании нового проекта. И когда я создавал сборку под новую (на тот момент) 2019 версию, просто забыл её убрать.