C++ 回溯内部信号处理器
我正试图遵循中的代码,让信号处理程序在诸如浮点和分段错误之类的错误上打印回溯。我使用seg故障信号作为起点。代码如下:C++ 回溯内部信号处理器,c++,c,signals,backtrace,C++,C,Signals,Backtrace,我正试图遵循中的代码,让信号处理程序在诸如浮点和分段错误之类的错误上打印回溯。我使用seg故障信号作为起点。代码如下: #include <cstdlib> //for exit() #include <signal.h> //signal handling #include <execinfo.h> //backtrace, backtrace_symbols and backtrace_fd #include <iostr
#include <cstdlib> //for exit()
#include <signal.h> //signal handling
#include <execinfo.h> //backtrace, backtrace_symbols and backtrace_fd
#include <iostream>
#include <string.h>
#include <stdio.h>
#define TRACE_MSG fprintf(stderr, "TRACE at: %s() [%s:%d]\n", \
__FUNCTION__, __FILE__, __LINE__)
void show_stackframe()
{
void *trace[1024];
char **messages = (char **) NULL;
int i, trace_size = 0;
TRACE_MSG;
trace_size = backtrace(trace, 1024); // segfault here???
// More code here to print backtrace, but not needed at the moment..
TRACE_MSG;
}
void sigSegvHandler( int signum, siginfo_t* info, void* arg )
{
TRACE_MSG;
show_stackframe();
return;
}
double func_b()
{
show_stackframe(); // Show that backtrace works without being
// called inside sighandler.
TRACE_MSG;
int int_a[5];
int_a[0] = 4;
int_a[11] = 10; // cause a segfault on purpose to see
// how the signal handling performs.
return 1.1;
}
int main()
{
// Examine and change the seg fault signal
struct sigaction segvAction; // File: /usr/include/bits/sigaction.h
// Initialize segvAction struct to all zeros for initialiation
memset( &segvAction, 0, sizeof( segvAction ) );
segvAction.sa_sigaction = sigSegvHandler;
segvAction.sa_flags = SA_SIGINFO; //Invoke signal catching function with 3 arguments instead of 1
// Set the action for the SIGSEGV signal
sigaction( SIGSEGV, &segvAction, NULL );
func_b(); // Produce a SIGSEGV error
}
我从程序接收以下输出:
TRACE at: show_stackframe() [stackoverflow.cpp:15]
TRACE at: show_stackframe() [stackoverflow.cpp:17]
TRACE at: func_b() [stackoverflow.cpp:33]
TRACE at: sigSegvHandler() [stackoverflow.cpp:22]
TRACE at: show_stackframe() [stackoverflow.cpp:15]
Segmentation fault
我的问题是,为什么show_stackframe()会在sigaction内部导致分段错误,但在不在sigaction处理程序内部时工作正常?显然,我似乎设置的信号处理器/操作不正确,但我一整天都没能找到它。GDB在这种情况下似乎没有任何帮助。如上所述,
回溯
函数同样不安全,这意味着从异步信号处理程序调用是不安全的。这样做会调用未定义的行为。请共享您的回溯
代码。问题的要点是回溯
是异步信号不安全的。我不明白为什么会有这么多的例子,人们公然从信号处理程序中调用它。@cnicutar谢谢你的评论。我真的很感谢你抽出时间。既然是这样,我也很惊讶地看到有这样的例子,特别是在这个例子中。您知道有没有其他方法可以模拟gdb功能,在错误时打印回溯而不使用信号处理程序?再次感谢!
TRACE at: show_stackframe() [stackoverflow.cpp:15]
TRACE at: show_stackframe() [stackoverflow.cpp:17]
TRACE at: func_b() [stackoverflow.cpp:33]
TRACE at: sigSegvHandler() [stackoverflow.cpp:22]
TRACE at: show_stackframe() [stackoverflow.cpp:15]
Segmentation fault