backtrace_symbols给了我segfault

时间:2018-11-04 00:12:30

标签: c++ gnu

异常在这里定义:

sorted_dict = sorted(t.values(), key = lambda x:x['Jf'], reverse=True)
print(sorted_dict)

当另一个进程拥有端口时抛出绑定:

BufferedImage

在这里抓到

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);
  }
};

调用e.test()时,在堆栈跟踪的末尾存在分段错误。我认为它与char **符号和backtrace_symbols有关,因为注释与之相关的任何代码都会删除backtrace。我是否正确使用此功能?正确的方法是什么?

1 个答案:

答案 0 :(得分:0)

tkausl points in the comments一样,您的函数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*,但实际上它什么也不返回。这是未定义的行为:

  

从函数末尾流出就等于没有值的返回; 这会导致返回值函数中的行为不确定

调高编译器警告以查看与此有关的警告。