【问题标题】:pthread_sigmask interferes with GDBpthread_sigmask 干扰 GDB
【发布时间】:2012-07-17 14:26:17
【问题描述】:

我一直在 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");

Catcher 线程例程:

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;
}

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

谢谢

【问题讨论】:

    标签: c gdb pthreads signals sigint


    【解决方案1】:

    在附加 gdb 之前,尝试使用 SIGSTOP(而不是 SIGINT)暂停程序。 SIGSTOP 不能被捕获或忽略,它会暂停你的程序,直到 gdb 附加到它(然后可以继续它)。

    【讨论】:

    • 没有办法覆盖标准的 GDB 行为吗?
    • @ziu 我不知道;粗略查看源代码表明src/gdb/inf-ptrace.c 中的inf_ptrace_stop 被硬编码为使用SIGINT。
    • 感谢您查看代码。不幸的是,我不能两次投票给你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2019-06-17
    • 2015-02-12
    • 2011-04-02
    • 2020-04-01
    • 2017-08-27
    • 2012-11-02
    相关资源
    最近更新 更多