如何将信号处理程序添加为方法
how to add signal handler as method
compile
# g++ -rdynamic ./test_stacktrace.cpp -o test_stacktrace
./test_stacktrace.cpp: In function ‘int main(int, char**)’:
./test_stacktrace.cpp:63:25: error: invalid use of non-static member function
signal(SIGSEGV, b.trace);
法典
/*
* g++ -rdynamic ./test_stacktrace.cpp -o test_stacktrace
*/
#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
class Backtrace {
public:
Backtrace();
void trace(int sig);
};
Backtrace::Backtrace(){}
void Backtrace::trace(int sig){
void *trace[10];
char **messages = (char **)NULL;
int i, trace_size = 0;
trace_size = backtrace(trace, 10);
messages = backtrace_symbols(trace, trace_size);
fprintf(stderr, "Error: signal %d:n", sig);
for(i=1; i<trace_size; ++i){
fprintf(stderr, "#%d %sn", i, messages[i]);
}
exit(1);
}
void baz(){
int *foo = (int*)-1;
printf("%dn", *foo);
}
void bar() { baz(); }
void foo() { bar(); }
int main(int argc, char **argv){
Backtrace b;
signal(SIGSEGV, b.trace);
foo();
}
不能添加成员函数,signal
函数无法将对象绑定b
。函数指针必须遵循以下格式:
typedef void (*sighandler_t)(int);
您的类型是:
void (Backtrace::*)(int);
您将需要以下任一:
要- 添加为信号处理程序的类
Backtrace
的全局函数和全局实例。 - 类的静态成员函数和静态实例
Backtrace
。
类似的例子可以在这里找到。
但是,看起来您的示例实际上并不需要类。您没有成员变量。您可以将trace
用作免费功能来实现您想要的。
如果您定义了Backtrace
的全局实例,则可以在普通函数或强制为正确类型的 lambda 表达式中使用它:
Backtrace b;
void bTrace(int s) { b.trace(s); }
int main() {
signal(SIGSEGV, &bTrace);
signal(SIGKILL, [](int s){ b.trace(s); });
}
相关文章:
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 将 c++ 包含添加到日食的正确方法
- 有什么方法可以将元素添加到列表中,如图所示?
- 在QT中为小部件添加彩色边框的最佳方法是什么
- 计算机使用什么方法添加无符号整数
- 为什么 memcpy() 是一种将元素添加到 'std::map' 的方法?
- 如何将信号处理程序添加为方法
- 添加具有模板专用化的方法
- 将动态方法添加到类中:使用宏函数到头文件中
- 向size_t添加 int 的正确方法
- 在犰狳立方体中添加一列 1 的有效方法
- 是否有类周围最薄的包装器来添加方法?
- 在从抽象基类继承的类中添加方法
- Inventor.h中矢量的添加方法出错
- 如何将常量传递给我的动态数组类添加方法
- C++:在不违反SRP的情况下向多态类层次结构添加方法
- 如何在c++中动态地向类添加方法
- 如何实现重叠添加方法
- 当派生指针仅添加方法时,将基指针强制转换为派生指针的有效性
- 为每个模板(int)形参向类中添加方法