我在随机时间收到分段错误 我注册了信号,但在发生分段错误时没有调用信号处理程序
#include <unistd.h>
#include <dlfcn.h>
#include <iostream>
#include <signal.h>
#include <execinfo.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
using namespace std;
void Handler(int sig)
{
cout << "handler called " << strsignal(sig) << endl;
exit(1);
}
int main()
{
cout << "Testing crash !" << endl;
signal(SIGSEGV, Handler);
signal(SIGINT, Handler);
signal(SIGABRT, Handler);
for (int i = 0; i < 10; i++)
{
cout << i << " Before open" << endl;
void *handler = dlopen("/home/user/Test.so", RTLD_LAZY);
if (handler)
{
cout << i << " Before close" << endl;
dlclose(handler);
cout << i << " After close" << endl;
}
else
{
cout << "Error " << dlerror() << endl;
}
}
return 0;
}
输出:
RUN1
Testing crash !
0 Before open
0 Before close
0 After close
1 Before open
1 Before close
Segmentation fault (core dumped)
Run2
0 Before open
0 Before close
0 After close
1 Before open
1 Before close
1 After close
Segmentation fault (core dumped)
问题是没有调用信号处理程序来分析问题
答案 0 :(得分:2)
问题是没有调用信号处理程序来分析问题
您的信号处理程序可能 被调用。但它可能会陷入僵局,因为它不是异步信号安全的。 Per POSIX:
行为未定义...如果信号处理程序调用任何函数 本标准中定义的除了列出的功能之一 下表。
此代码调用异步信号 不安全 函数,and therefore invokes undefined behavior:
Stripe.createToke
只能从信号处理程序中调用 async-signal-safe函数。
任何类型的C ++流的 String sql = "insert into medicinename (name, pgurl) values (?, ?)";
PreparedStatement preparedStmt = conn.prepareStatement(sql);
preparedStmt.setString (1, element.getName());
preparedStmt.setString (2, element.getPgurl());
preparedStmt.executeUpdate();
you should delete executeUpdate(sql); to executeUpdate();
和任何使用都不是异步信号安全的。
Per POSIX, the list of async-signal-safe functions are:
void Handler(int sig)
{
cout << "handler called " << strsignal(sig) << endl;
exit(1);
}
请注意,Linux不符合POSIX标准。 On Linux, fork()
is broken and is not async-signal-safe.