backtrace_symbols дает мне segfault - PullRequest
       14

backtrace_symbols дает мне segfault

0 голосов
/ 04 ноября 2018

Исключение определяется здесь:

class MyException : public std::system_error {
  using std::system_error::system_error;
  public:
  const char* test () const throw () {
    void * array[30000];
    int nSize = backtrace(array, 30000);
    char ** symbols = backtrace_symbols(array, nSize);

    for (int i = 0; i < nSize; i++) {
      std::cout << symbols[i] << std::endl;

    }

    free(symbols);
  }
};

Брошено на привязку, когда другой процесс владеет портом:

   if (errno = bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
          throw MyException(std::error_code(errno, std::generic_category()), "Bind failed");
        }

Поймано здесь:

} catch (MyException& e) {
    std::cout << "Caught system_error with code " << e.code()
      << " meaning " << e.what() << e.test() << '\n';
  }

Когда вызывается e.test (), в конце трассировки стека возникает ошибка сегментации. Я полагаю, что это связано с символами char ** и backtrace_symbols, поскольку комментирование любого кода, который имеет дело с этим, удалит обратную трассировку. Я правильно использую эту функцию? Как правильно это сделать?

1 Ответ

0 голосов
/ 04 ноября 2018

Поскольку указывает в комментариях , ваша функция test() ничего не возвращает.

  const char* test () const throw () {
    void * array[30000];
    int nSize = backtrace(array, 30000);
    char ** symbols = backtrace_symbols(array, nSize);

    for (int i = 0; i < nSize; i++) {
      std::cout << symbols[i] << std::endl;

    }

    free(symbols);
  }

Здесь вы сказали компилятору, что ваша функция test() вернет const char*, но фактически ничего не возвращает. Это неопределенное поведение:

Выход из конца функции эквивалентен возврату без значения; это приводит к неопределенному поведению в функции, возвращающей значение

Включите предупреждения вашего компилятора, чтобы увидеть предупреждение об этом.

...