2015-05-27 3 views
-1

2011 главная() программа My C++ для DiGSE является:основной() программа не выйдет нормально

int main(int argc, char* argv[]) { 
. . . 
return EXIT_SUCCESS; 
} // this } DOES match the opening { above 

Он компилирует и выполняет правильно. Операция печати непосредственно перед возвратом выводится нормально. Однако появляется уведомление Windows 7.1 о том, что «DiGSE.exe перестает работать». Затем он любезно предлагает искать в Интернете решение.

Я попытался заменить возврат с возвратом 0; Выход (0); и ничего, поэтому выполнение выпадает на дно (что, как я понимаю, приемлемо). Однако во всех случаях я все еще получаю всплывающее окно.

Что мне нужно сделать, чтобы main() вышел изящно?


DiGSE - это всего лишь имя исполняемого файла Windows 7, составленного на MinGW 4.9.2. "Полная" программа уже урезанная:

int main(int argc, char* argv[]) { 

try { 
DiGSE::log_init(DiGSE::log_dest_T::console_dest, "dig.log", true, 
       DiGSE::log_lvl_T::trace_lvl); 
}//try 

catch (const std::exception& ex) { 
    std::cerr << FMSG("\n" 
         "Executing '%1%' raised this exception:\n" 
         " %2%", % DiGSE::Partition::productName() 
         % ex.what()) 
       << std::endl; 
    return EXIT_FAILURE; 
}//exception 

catch (...) { 
    std::cerr << FMSG("\n" 
         "Executing '%1%' instance raised an unknown exception.", 

         % DiGSE::Partition::productName()) 
       << std::endl; 
    return EXIT_FAILURE; 
}//exception 

L_INFO(FMSG("'%1% v%2%' terminated normally.", 
      % DiGSE::Partition::productName() 
      % DiGSE::Partition::productVersion())) 
return EXIT_SUCCESS; 

} // главная()

L_INFO() является регистрация вызова, который выводит, как это должно быть. Log_init() в верхней части инициализирует журнал. Комментирование log_init() и L_INFO() имеет тот же результат, что и исходный.


Программный сигнал SIGSEGV, ошибка сегментации. 0x000000006fc8da9d в libstdC++ - 6 _ZNSo6sentryC1ERSo() из D: \ Program Files \ MinGW-w64 \ x86_64-4.9.2-POSIX-SEH-rt_v3-rev0 \ mingw64 \ бин \ libstdC++ - 6.dll

Это то, что gdb возвращает, когда почта() выходит. Он делает это даже с комментариями log_init() и L_LNFO(). Таким образом, проблема, вероятно, связана с одним из глобалов того, с чем она связана.

+0

просвещать меня ... что такое DiGSE? Это какая-то специальная операционная система или архитектура? Если это так, вам, возможно, придется прочитать об этом, чтобы узнать, какое значение ожидает операционная система. Если это действительно странно, возможно, оно отличается от 0 или макросом EXIT_SUCCESS –

+4

Что находится в '...' части? – JustSid

+0

@HenrikKjusAlstad S/he явно заявляет, что 'Windows 7.1' является ОС. – JustSid

ответ

3

Возможно завершение работы программы после окончания main - программа еще не закончена. Следующие пункты выполняются после main() возвращений:

  • Зарегистрированных at_exit обработчиков
  • деструкторов main() «s собственных автоматической переменных, и все переменных с длительностью статического хранения (глобал и функцией-статической) (C++ только)
  • DllMain(PROCESS_DETACH) код во всех динамических библиотеках, которые вы используете (только для Windows)

В дополнение к этому различные события могут возникать вне вашей программы и вызывать сбои, которые вы переносите ХТ ошибка для отказа вашей программы (особенно если ваши вилы программы или Призывает копии себя):

  • SIGCHLD поднят (на * NIX).Процесс ручки становится сигналом и вызывать функции ожидания возврата (на Windows)
  • Всех открытых ручек (файловые дескрипторы) получить заброшенные и close обработчика в драйвере вызывается
  • Другого конец соединения (трубы, розетка) сдвига в отключенном состоянии (читает возврата 0, пишет сбой, на * Nix SIGHUP может быть поднят)

Я предлагаю присоединить отладчик, установить контрольную точку в конце главной, а затем пошагово через код очистки чтобы узнать, где происходит сбой. Divide and conquer также может быть полезным (вырезать некоторые глобальные переменные или все использование определенной DLL).

Смежные вопросы