Перейти к содержанию
    

Неожиданное обнуление семафора

Понял о чем вы. О том что заворачивание в assert может привести к тому что функции вообще не вызовется. Не мой случай, у меня assert - это мой макрос, на него не влияют никакие настройки. Ну и прежде чем использовать какой-то макрос конечно надо посмотреть как он реализован и что на него влияет.

assert - часть стандартной библиотеки, что на него влияет, описано в стандарте.

Рассчитывать, что ваш код всегда будет работать с перепиленной вами версией макроса, - раскидывать грабли.

 

assert - это проверка "контракта". Если assert не прошел - дальнейшее выполение программы не имеет смысла.

Во время отладки да, а при работе у конечных пользователей остановка программы зачастую гораздо хуже продолжения её выполнения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во время отладки да, а при работе у конечных пользователей остановка программы зачастую гораздо хуже продолжения её выполнения.

assert применяется для проверки критичных условий, выход за которые означает крах.

Если assert сработал - дальнейшее выполнение программы опасно, может привести к непредсказуемым последствиям. При сработке assert правильное поведение (имхо) - фиксация файла и строки в энергонезависимой памяти и ресет.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

assert применяется для проверки критичных условий, выход за которые означает крах.

Нет. Ассерт - просто средство отладки. Он нужен программисту, но никак не конечному пользователю.

 

Если assert сработал - дальнейшее выполнение программы опасно, может привести к непредсказуемым последствиям. При сработке assert правильное поведение (имхо) - фиксация файла и строки в энергонезависимой памяти и ресет.

Если б всё было так, всякие мобильники и телевизоры постоянно бы висли или вырубались. Ну и в иных местах просто были бы тормознее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот для примера сделал минимальный проект в IAR (пристегнутый zip). empty\tmp\Debug\List\Project.map.

В объекте gLog есть поле _inited и _fileSpec, а в map-файле этих полей в явном виде нет. Почему?

Почему УЖЕ писал:

Если _semaphore элемент структуры, то в map будет адрес и размер структуры

То-же естесественно, относится к любым объектам. Данные объекта gLog в map есть - 44 байта. Расположение переременных Вы сами задали:

class Log

{

private:

int _inited;

char _fileSpec[40];

Так-что что может быть непонятным-то? В структурах и классах могли-бы вообще и map не смотреть - Вы же своими собственными руками описали что рядом с чем находится.

 

Посмотите на класс в Вы который зарыли _semaphore и все будет ясно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Данные объекта gLog в map есть - 44 байта. Расположение переременных Вы сами задали

А, получается просто в виде адресов. Предполагал что там будут имена переменных, а имен там нет.

 

 

Нет. Ассерт - просто средство отладки. Он нужен программисту, но никак не конечному пользователю.

Конечному пользователю и дебаггер не нужен. Ему нужен корректно работающий девайс.

Нет программ без ошибок. Вы же не будете утверждать обратное?

 

Если б всё было так, всякие мобильники и телевизоры постоянно бы висли или вырубались. Ну и в иных местах просто были бы тормознее.

Отсюда я делаю вывод, что в мобильниках и телевизорах куча ассертов, которые отключены из-за того, что если бы они были включены, мобильники и телевизоры постоянно бы висли или вырубались?

 

 

Посему, хотите верьте, хотите нет, но затираете Вы явным образом сами. Ну или не совсем явным. Смотрите, например, на какой-нибудь массив расположенный рядом с этой переменной.

Действительно обнаружил неверную трактовку размера массива. Массив состоит из uint64, а я его размер узнавал с помощью sizeof, без учета что размер элемента не 1 байт... Сказывается очень много работы со строками, где sizeof и равен размеру массива.

 

Мораль - если что-то не работает, начинайте с того места, где это не работает. А не с подозрений на компилятор, гейтса и фазу луны.

 

Но зато в процессе открыл для себя map-файлы. И раньше знал что есть что-то такое, но не лазил. А в map файле очень хорошо видно расход ОЗУ по модулям и переменным. Правда жаль что в map файле нет имен полей (переменных) объекта, только методы и глобальные переменные.

 

 

 

можно через JTAG поставить DataBreakpoint и не париться

Отличная штука, и применял же такое в разработке для ПК, но тут как-то не догадался.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечному пользователю и дебаггер не нужен. Ему нужен корректно работающий девайс.

Нет программ без ошибок. Вы же не будете утверждать обратное?

Виснущий девайс для пользователя гораздо хуже работающего кое как. Тем более, что пользователь зачастую и не замечает, что перед ним это самое "кое как".

 

Отсюда я делаю вывод, что в мобильниках и телевизорах куча ассертов, которые отключены из-за того, что если бы они были включены, мобильники и телевизоры постоянно бы висли или вырубались?

Отключены они из-за того, что пользователю они ни к чему. Лучше пользователю от них не станет, а хуже может.

Они и разработчикам не нужны в большинстве случаев. Я не про ассерты вообще и разработчиков вообще, я про конкретно ситуацию с мобилками и телевизорами. У разработчиков/тестеров есть дебаг сборки прошивок, но и там включают ассерты не везде, а лишь в части модулей/библиотек.

 

Закруглюсь, пожалуй, с этой темой. Сказал уже всё, что мог, нового ничего не добавлю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Виснущий девайс для пользователя гораздо хуже работающего кое как. Тем более, что пользователь зачастую и не замечает, что перед ним это самое "кое как".

Кое-как он работать не будет. Если по ассерту не прошло условие, но ассерт отключен - дальше работа приведет скорее всего к зависанию/хардфаулту и сбросу по вочдогу, в худшем - к непредусмотренному сценарию управления исполнительным механизмом.

 

А иначе разработчик неправильно применяет ассерты.

Изменено пользователем turnon

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...