Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отключить окно "C++ runtime error"?  (Прочитано 18145 раз)
0 Пользователей и 7 Гостей смотрят эту тему.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« : 14-07-2009 06:00 » 

Добрый день, Коллеги!

Есть тестовый модуль (юнит тесты и всё такое), тестовый модуль - консольное приложение, он иногда выбрасывает не обрабатываемое исключение, как следствие появляется сообщение  "C++ runtime error" с кнопкой "Ok" пока её не нажмёшь процесс не умирает.

Как отключить эту хрень?
А то фигня полная, консольное приложение отображает окно, особенно здорово, когда приложение запускается из "Планировщика задач" от имени другого пользователя.

Записан

Странно всё это....
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 14-07-2009 06:40 » 

Захучить виндовые окошки сообщений и фильтровать нужные или ваще все на время теста и возвращать IDOK.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 14-07-2009 09:35 » 

LogRus,
а в самом nunit-е ничего подобного нет?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 15-07-2009 04:25 » 

Джон, как-то это не круто.
Malaja, nunit? неее, boost::test framework Улыбаюсь
ничего такого не видел, вообще он сам отлавливает все исключения и пишет, что тест провален, в теории, на практике не всегда.
Записан

Странно всё это....
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 15-07-2009 06:29 » 

Если верить msdn, то /SUBSYSTEM:Console, должно помочь, в тоже время наличие main вместо WinMain, вроде как делает эквивалентно /SUBSYSTEM:Console, но что-то я не заметил.
« Последнее редактирование: 15-07-2009 07:04 от LogRus » Записан

Странно всё это....
zubr
Гость
« Ответ #5 : 15-07-2009 06:42 » 

Самый лучший вариант, все таки найти источник исключения и устранить его (если это возможно). Ну и как вариант:
Запускать данный процесс из другого процесса, который будет делать TerminateProcess, получив от основного процесса, к примеру event, по окончании main.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 15-07-2009 06:42 » 

Джон, как-то это не круто.

Аааа. Ну... дык. Улыбаюсь)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 15-07-2009 07:04 » 

Кстати, проблема в тесте оказалась в другом (ну в данном конкретном), оказалось, что из потока который выполнял работу выбросилось CTRL+C, обработчик по умолчанию прокидывает сигнал на уровень скриптов запускающих тест, лечится переназначением обработчика сигнала.

zubr, ну собственно так и делается только во всех процессах обработчик дефолтовый и сигнал доходит до самого верхнего уровня заваливая всю систему автосборки
кстати откуда исключение я и так знаю Улыбаюсь и возникает оно правильно, тест нашел ошибку Улыбаюсь
« Последнее редактирование: 15-07-2009 07:07 от LogRus » Записан

Странно всё это....
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #8 : 15-07-2009 07:31 » 

Не выличилось Жаль
проклятый cmd всегда перехватывает CRTL+C
Записан

Странно всё это....
Mayor
Специалист

ru
Offline Offline

« Ответ #9 : 15-07-2009 13:19 » 

Если верить msdn, то /SUBSYSTEM:Console, должно помочь, в тоже время наличие main вместо WinMain, вроде как делает эквивалентно /SUBSYSTEM:Console, но что-то я не заметил.

не поможет, уже давно проверял

попробуй обернуть код в main try catch
Записан

1n c0de we trust
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 15-07-2009 13:36 » 

LogRus, собственно говоря то про что Ирина сказала. В некоторых тест-фреймворках есть специальные ф-ции для отлавливания системных сообщений об ошибке. Если у тебя такого нет, то придётся делать самому. А как ещё отловить системные диалоги, кроме как внедрения в систему? Думаю, что и упомянутые фреймворки делают это точно так же. Не знаю, что ты такого "некрутого" в этом усмотрел. Ведь это совершенно нормальная ситуация, когда ошибка исходит из самой системы, она должна появиться, а твой тест только подготавливает (провоцирует) её. Например, вдруг пропадает связь с принтером. Значит твоя программа должна чисто обработать такую ситуацию, но перед этим система показывает свою ошибку. Нормально пользователь закрыват окошко и программа работает дальше. При автоматическом тестировании эту ф-ю пользователя и должна взять на себя эта дополнительная прожка.  В принципе ты можешь даже ею управлять, чтобы она отвечала твоему юниттесту дескать всё хокей, система показала ошибку, а не просто перехватывать исключение. И это будет правильно. ИМХО разумеется.
« Последнее редактирование: 15-07-2009 13:38 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #11 : 16-07-2009 04:03 » new

Джон, почему не круто?
всё что я хочу, это что бы если я сказал в студии, что ПО консольное значит оно консольное и не надо мне подключать CRT выводящее окна, иначе оно не консольное, его нельзя использовать в скриптах и в связке со сторожем.

То, что это можно всё перехватить перенастроить, это всё понятно и трудностей никаких не представляет.

Ну в общем текущее решение для моего случая:
1. Временно заменён обработчик SIGINT в одном из тестов, на вывод сообщения и exit
2. Решено изменить механизм завершения системы, т.е. избавится от засылки SIGINT
Записан

Странно всё это....
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 16-07-2009 06:31 » 

Так нет, подожди. Тебя ж смущает системное сообщение об ошибке. Какая разница, консольное приложение или нет? Оно всё-равно покажется.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #13 : 16-07-2009 07:03 » 

а вот нахрена? если в документации написано (msdn), что будет сделан вывод в stderr (это поведения для консольного приложения, абсолютно естественно)

консольное приложение априори не должно показывать окна, а если я его через ssh дёргаю, мне бошку расшибить на кнопку из консоли умудрится нажать? а админ сервера, как удивится при появлении сообщения от приложения которое работает через ssh от имени другого пользователя?
Записан

Странно всё это....
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 16-07-2009 07:26 » 

Эммм мы о разных вещах говорим. Твою проблему с нажатием кнопки я хорошо представляю, поэтому и предложил хук, как самое безгеморрное средство. Представь себе в дебрях некой superpuperwin32.dll в ф-ции Function1() есть строчка а ля if(error==TRUE) ::MessageBox(...); и твоё прожка так или иначе к ней обращается. Какое ей дело, кто её вызвал? Консольное приложение или оконное? Напрямую или через туеву хучу других динамически загруженых длл? Тобой управляемые потоки ты направляешь сам куда хочешь, а системные?

Вот смотри, у меня была похожая задача. Нашу прожку надо было запускать в консольном режиме для печати проекта переданного ей в качестве параметра. Причём клиенты зафигачивают это дело в высшем автоматизме - абсолютно без какого либо участия человека.
Вся проблема заключалась в том, что принтер клиенты перефигачили и вместо бумаги в него загружаются пластиковые "этикетки", загрузка такой "этикетки" длиться дольше, чем терпение виндовского спулера или родного монитора (PrinterLanguageMonitor) и тот, и другой показывают сообщение об ошибке - "Нет бумаги". Пришлось писать монитор самим и фильтровать ошибку со своим, более долгим таймаутом.

Я конечно не знаю, какие системные ресурсы ты задействуешь, что выскакивает сообщение. Может всё гораздо проще. Знаю у некоторых вещей, например у инсталлятора (msi) есть такие режимы подавления ошибок в silent режиме, но опять же спцифичных сообщений. Как раз для удалённой или массовой инсталляции. Но как продусмотреть ВСЕ случаи возникновения ошибки...

зы Тут вдруг подумалось, а винда-то какая? Win32 NT? Так у неё консоль это тоже окошко. Вот под 9х был режим "Перезагрузиться в" там уже был настоящий текстовый режим и консоль.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #15 : 17-07-2009 09:08 » 

Джон, согласен самое простое, но хочется докопаться до сути.
к тому же один и тот же код работает в Linux и Windows
в общем нет у нас окон Улыбаюсь и всё тут. есть одно окно писанное под wxWidgets (опять Linux + Windows), да и то это просто интерфейс удалённого управления сервером.

итак. проблема решена:
1. /SUBSYSTEM:CONSOLE в линкере
2. /SUBSYSTEM:CONSOLE ВО всех используемых DLL, оказалось, что в паре dll, /SUBSYSTEM:WINDOWS
т.е. убедитесь, что все ваши компоненты используют нужную вам CRTLib

Т.е. всё работает согласно документации, если сами, где-то не лажали Улыбаюсь
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines