Linux регистрирует необработанное исключение, выданное демоном?

Я написал 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?

3

Решение

У вас есть два решения:

  • один: вы измените свой вызов функции демона на

    daemon(1,1);
    

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

  • два: вы не меняете вызов, но вы добавляете глобальный try { /* main code here */ } catch(...){ /* logging code here */ } записать любое необработанное исключение в файл.

5

Другие решения

Предполагая, что вы понимаете, что вход в систему Дидьер предполагает, Вы можете рассмотреть возможность установки 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();
}
3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector