Всем привет, сделал небольшой сервак в виде TAO модуля. Суть проста через интерфейс принимает данные, в другом потоке рассылает события об изменениях подписчикам через интерфейс обратного вызова. Написал программку которая нагружает его, в Debug все отлично, в Release из под студии получаю:
Exception thrown at 0x75E1EAE2 in toris2_server.exe: Microsoft C++ exception: std::system_error at memory location 0x00F3DF44.
Exception thrown at 0x75E1EAE2 in toris2_server.exe: Microsoft C++ exception: std::system_error at memory location 0x00F3DF44.
Exception thrown at 0x75E1EAE2 in toris2_server.exe: Microsoft C++ exception: std::system_error at memory location 0x00F3DF44.
Exception thrown at 0x75E1EAE2 in toris2_server.exe: Microsoft C++ exception: std::system_error at memory location 0x00F3DF44.
Exception thrown at 0x75E1EAE2 in toris2_server.exe: Microsoft C++ exception: std::system_error at memory location 0x00F3DF44.
Exception thrown at 0x75E1EAE2 in toris2_server.exe: Microsoft C++ exception: std::system_error at memory location 0x00F3DF44.
Exception thrown at 0x75E1EAE2 in toris2_server.exe: Microsoft C++ exception: std::system_error at memory location 0x00F3DF44.
Exception thrown at 0x75E1EAE2 in toris2_server.exe: Microsoft C++ exception: std::system_error at memory location 0x00F3DF44.
Exception thrown at 0x75E1EAE2 in toris2_server.exe: Microsoft C++ exception: std::system_error at memory location 0x00F3DF44.
Exception thrown at 0x75E1EAE2 in toris2_server.exe: Microsoft C++ exception: std::system_error at memory location 0x00F3DF44.
Exception thrown at 0x75E1EAE2 in toris2_server.exe: Microsoft C++ exception: std::system_error at memory location 0x00F3DF44.
Все как бы работает, но так как TAO библиотека мудрая то она это исключения передает клиенту, его конечно перехватываешь и все ок, данные не потерялись,
но хочется разобраться в чем причина, подскажите может есть настройки компилятора какие-то что бы как-нибудь выявить это, в общем за любые советы спасибо.
Здравствуйте, _agg, Вы писали:
_>Все как бы работает, но так как TAO библиотека мудрая то она это исключения передает клиенту, его конечно перехватываешь и все ок, данные не потерялись, _> но хочется разобраться в чем причина, подскажите может есть настройки компилятора какие-то что бы как-нибудь выявить это, в общем за любые советы спасибо.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, _agg, Вы писали:
_>>Все как бы работает, но так как TAO библиотека мудрая то она это исключения передает клиенту, его конечно перехватываешь и все ок, данные не потерялись, _>> но хочется разобраться в чем причина, подскажите может есть настройки компилятора какие-то что бы как-нибудь выявить это, в общем за любые советы спасибо.
_>1. А что пишет само исключение, если поймать? _>
_>2. Отладчик в студии больше не работает? Можно же останавливаться при возникновении данного исключения.
Вот само исключение в сервере я наблюдаю только в окне Output, где оно именно происходит непонятно, пробовал перехватывать но увы.
В данный момент поиграл настройками компилятора и когда указываешь оптимизацию "Optimizations (Favor Speed) (/Ox)" таких исключений не возникает.
Плохо что не разобрался конечно в чем причина, но ситуацию исправил.
Здравствуйте, _agg, Вы писали:
_>В данный момент поиграл настройками компилятора и когда указываешь оптимизацию "Optimizations (Favor Speed) (/Ox)" таких исключений не возникает. _>Плохо что не разобрался конечно в чем причина, но ситуацию исправил.
ничего не исправил, просто замотал под коврик. в дебаге переменные явно инициализируются (обнуляются или спец константа), в релизе же там может быть любой мусор, вот оно и стреляет.
Здравствуйте, mike_rs, Вы писали:
_>в дебаге переменные явно инициализируются (обнуляются или спец константа)
По-моему, компиляторы, обнуляющие переменные в стеке, остались в далеком прошлом. А спецконстанты обычно такие, что нормальная работа при них очень маловероятна. У меня вот ни разу не было, чтоб забыл инициализировать, и в дебаге ничего не глючило.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>По-моему, компиляторы, обнуляющие переменные в стеке, остались в далеком прошлом. А спецконстанты обычно такие, что нормальная работа при них очень маловероятна.
ключевая разница между дебаг и релиз — это явная инициализация переменных дефолтными значениями, а не мусором. от этого все беды.
Здравствуйте, mike_rs, Вы писали:
_>ключевая разница между дебаг и релиз — это явная инициализация переменных дефолтными значениями, а не мусором. от этого все беды.
И что, есть комплиятор, который реально в дебаге инициализирует нулём, а не специально подобранным мусором, который с высокой вероятностью стрельнет? А кто такое грабледром сделал и зачем?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
TB>А кто такое грабледром сделал и зачем?
Вы стандарт видели (так и задумано) — это специальный грабледром, который позволяет в случае UB выполнят прикольные оптимизации (отключенные в дебаге) которые потом приводят к чудесам. И по стандарту компилятор в этом не виноват, виноват человек который использует этот компилятор.
Так что статический асинизатор анализвтор в руки и алга.
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, T4r4sB, Вы писали:
TB>>А кто такое грабледром сделал и зачем? _>Вы стандарт видели (так и задумано) — это специальный грабледром, который позволяет в случае UB выполнят прикольные оптимизации (отключенные в дебаге) которые потом приводят к чудесам.
Да, а ещё он позволяет в дебаге раскидать код так, чтоб потенциальные УБ сразу стреляли.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Вменяемый компилятор, в режиме высокого уровня предупреждений, непременно на такое выругается. Ну а кто компилит с W3, тот ССЗБ.
А вот в отношении переменных-членов компилятор уже не так строг, поэтому в функциях-членах весьма пользительно иметь что-нибудь вроде Assert (static_cast <int> (x) <= 1). Заодно помогает ловить и просто порчу памяти.
Здравствуйте, T4r4sB, Вы писали:
_>>ключевая разница между дебаг и релиз — это явная инициализация переменных дефолтными значениями, а не мусором. от этого все беды. TB>И что, есть комплиятор, который реально в дебаге инициализирует нулём, а не специально подобранным мусором, который с высокой вероятностью стрельнет? А кто такое грабледром сделал и зачем?
Примерно три недели назад выловил баг с не инициализированным членом класса. Переменная была 0 и в debug, и в release сборках. gcc для arm.