pthread_sigmask会干扰GDB

ziu*_*ziu 2 c gdb signals pthreads sigint

我一直致力于Linux下的多线程程序,对信号处理有特殊要求.例如,我需要程序打印单个Ctrl-C输入的统计信息.

我使用pthread_sigmask和sigwait来实现它,即我在创建其余线程之前阻止主线程中的所有非关键信号,并且我启动了在sigwait上阻塞的"捕获器"线程.

初始化(主要):

sigfillset(&set);
sigdelset(&set, SIGSEGV);
sigdelset(&set, SIGBUS);
sigdelset(&set, SIGILL);

s = pthread_sigmask(SIG_BLOCK, &set, NULL);
if (s != 0)
    handle_error_en(s, "pthread_sigmask");

s = pthread_create(&signal_thread, NULL, &sig_thread, (void *) &set);
if (s != 0)
    handle_error_en(s, "pthread_create");
Run Code Online (Sandbox Code Playgroud)

捕手线程例程:

void *sig_thread(void *arg) {
    sigset_t *set = (sigset_t *) arg;
    int s, sig;

    pthread_detach(pthread_self());

    for(;;) {
        s = sigwait(set, &sig);
        if (s != 0)
            handle_error_en(s, "sigwait");
        switch(sig) {
            case SIGINT:
                break;
            case SIGTERM:
                break;
            case SIGUSR1:
                break;
            case SIGUSR2:
                break;
            default:
                break;
        }
    }
    pthread_exit(NULL);
    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作,但我的捕获机制阻止GDB暂停程序(触发SIGINT例程).我怎样才能解决这个问题 ?

谢谢

eca*_*mur 6

尝试在附加gdb之前暂停程序SIGSTOP(而不是SIGINT). SIGSTOP无法捕获或忽略,它将暂停您的程序,直到gdb附加到它(然后可以继续).