信号处理程序没有调用dlopen或dlclose

时间:2017-04-19 05:11:39

标签: c++ c linux embedded-linux

我在随机时间收到分段错误 我注册了信号,但在发生分段错误时没有调用信号处理程序

#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)

问题是没有调用信号处理程序来分析问题

1 个答案:

答案 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.