siginfo 匿名工会

Posted

技术标签:

【中文标题】siginfo 匿名工会【英文标题】:siginfo anonymous unions 【发布时间】:2013-04-01 22:56:29 【问题描述】:

我正在尝试获取生成 sigsys 信号的系统调用的地址!但我从 gcc 收到以下错误:

gcc emulator.c -fms-extensions
error: ‘siginfo_t’ has no member named ‘si_call_addr’

我使用的代码是:

static void emulator(int nr, siginfo_t *siginfo, void *void_context)

        ucontext_t *ctx = (ucontext_t *)(void_context);
        int syscall;
        char *buf;
        ssize_t bytes;
        size_t len;


        if (siginfo->si_code != SYS_SECCOMP)
                return;
        if (!ctx)
                return;


        syscall = ctx->uc_mcontext.gregs[REG_SYSCALL];
      printf("System call %d ADDR %X\n", syscall,  siginfo->si_call_addr);

        setcontext(ctx);

        return;

si_call_addr 被定义为 siginfo_t 中的匿名结构。

【问题讨论】:

【参考方案1】:

siginfo_t 中没有si_call_addr。您可能正在寻找si_addr 成员。

这是linux提供的siginfo_t:

 siginfo_t 
       int      si_signo;    /* Signal number */
       int      si_errno;    /* An errno value */
       int      si_code;     /* Signal code */
       int      si_trapno;   /* Trap number that caused
                                hardware-generated signal
                                (unused on most architectures) */
       pid_t    si_pid;      /* Sending process ID */
       uid_t    si_uid;      /* Real user ID of sending process */
       int      si_status;   /* Exit value or signal */
       clock_t  si_utime;    /* User time consumed */
       clock_t  si_stime;    /* System time consumed */
       sigval_t si_value;    /* Signal value */
       int      si_int;      /* POSIX.1b signal */
       void    *si_ptr;      /* POSIX.1b signal */
       int      si_overrun;  /* Timer overrun count; POSIX.1b timers */
       int      si_timerid;  /* Timer ID; POSIX.1b timers */
       void    *si_addr;     /* Memory location which caused fault */
       long     si_band;     /* Band event (was int in
                                glibc 2.3.2 and earlier) */
       int      si_fd;       /* File descriptor */
       short    si_addr_lsb; /* Least significant bit of address
                                (since kernel 2.6.32) */
   

【讨论】:

这不是当前版本.. 从内核 3.5 开始,这已更改为 lxr.oss.org.cn/source/include/asm-generic/siginfo.h @GiuseppePes 此处显示的结构是呈现给用户空间的 ABI(在 glibc 2.16 中)有没有显示内核头文件。

以上是关于siginfo 匿名工会的主要内容,如果未能解决你的问题,请参考以下文章

57 mac 中 SIGINFO 信号, jdk8 支持, 但是 jdk9 不支持?

57 mac 中 SIGINFO 信号, jdk8 支持, 但是 jdk9 不支持?

57 mac 中 SIGINFO 信号, jdk8 支持, 但是 jdk9 不支持?

sigaction()

gperftools尝试

Linux C 信号