Я написал Linux-демон на C ++. Код выглядит примерно так:
int main(int argc, char** argv)
{
daemon(1, 0); // Daemonize itself, retaining the current working directory and redirecting stdin, stdout and stderr to /dev/null.
// My program logic goes here
}
Проблема в том, что моя логика программы иногда генерирует исключения. Как я могу поймать исключения, чтобы я мог знать, где идет не так?
Я знаю, что для простого консольного приложения необработанное исключение будет сброшено на консоль. В моем случае после вызова daemon (1, 0) консоль перестала быть доступной.
В Windows любые неперехваченные исключения будут сохраняться ОС и могут быть просмотрены с помощью средства просмотра событий в разделе «Управление компьютером». Есть ли подобный механизм в Linux?
У вас есть два решения:
один: вы измените свой вызов функции демона на
daemon(1,1);
что позволит программе по-прежнему иметь доступ к stdout, и впоследствии будет сохранено поведение по умолчанию при выгрузке неперехваченных исключений в консоль.
два: вы не меняете вызов, но вы добавляете глобальный try { /* main code here */ } catch(...){ /* logging code here */ }
записать любое необработанное исключение в файл.
Предполагая, что вы понимаете, что вход в систему Дидьер предполагает, Вы можете рассмотреть возможность установки std::set_terminate()
обработчик, так что вы можете увидеть трассировка стека от необработанного исключения
#include <iostream>
#include <stdexcept>
#include <execinfo.h>
void
handler()
{
void *trace_elems[20];
int trace_elem_count(backtrace( trace_elems, 20 ));
char **stack_syms(backtrace_symbols( trace_elems, trace_elem_count ));
for ( int i = 0 ; i < trace_elem_count ; ++i )
{
std::cout << stack_syms[i] << "\n";
}
free( stack_syms );
exit(1);
}
int foo()
{
throw std::runtime_error( );
}
int
main()
{
std::set_terminate( handler );
foo();
}