如何解决在Linux 32位机上的REG_EIP未声明(首次在此函数中使用)错误?

我在用C语言编写的用gcc编写的信号处理器程序时遇到了错误,在发生分段错误后显示转储的寄存器值。 当我尝试使用代码访问它时:

void print_registers(FILE *fd, ucontext_t *ctx, bool fpu = false) { const char *flags_str[] = { "CF", 0, "PF", 0, "AF", 0, "ZF", "SF", "TP", "IF", "DF", "OF", 0, 0, "NT", 0, "RF", "VM", "AC", "VIF", "VIP", "ID" }; greg_t *regs = ctx->uc_mcontext.gregs; void *eip[1] = { (void*)regs[REG_EIP] }; char **symbol = backtrace_symbols(eip, 1); fprintf(fd, "Registers:\neip is at "); backtrace_symbols_fd(eip, 1, fd->_fileno); size_type flags = regs[REG_EFL]; fprintf(fd, "eflags: %x [ ", flags); for (size_type i = 0; i < sizeof(flags_str) / sizeof(flags_str[0]); ++i) { if (!flags_str[i]) continue; if (flags & (1 << i)) fprintf(fd, "%s ", flags_str[i]); } size_type iopl = (flags & 0x3000) >> 12; fprintf(fd, "] iopl: %i\n" "eax: %08x\tebx: %08x\tecx: %08x\tedx: %08x\n" "esi: %08x\tedi: %08x\tebp: %08x\tesp: %08x\n" "cs: %04x\tgs: %04x\tfs: %04x\n" "ds: %04x\tes: %04x\tss: %04x\n", iopl, regs[REG_EAX], regs[REG_EBX], regs[REG_ECX], regs[REG_EDX], regs[REG_ESI], regs[REG_EDI], regs[REG_EBP], regs[REG_ESP], regs[REG_CS], regs[REG_GS], regs[REG_FS], regs[REG_DS], regs[REG_ES], regs[REG_SS]); } } 

我试着通过添加代码

  #include<sys/ucontext.h> 

以及

  #define _GNU_SOURCE #ifndef REG_EIP #define REG_EIP 0x23b46F #endif 

但是,出现的错误是:

  'REG_EIP' undeclared (first use in this function) (Each undeclared identifier is reported only once for each function it appears in.) 

并且错误出现在所有寄存器中

我尝试了很多文件,但无法获得解决scheme。 任何人都可以分享解决这个错误的细节。

感谢所有的反馈者

包含<ucontext.h 之前尝试定义<ucontext.h

 #define __USE_GNU #include <ucontext.h> 

你不需要明确地包含<sys/ucontext.h><ucontext.h>会这样做。

我相信你应该有#define _GNU_SOURCE作为源文件的第一行,或者在你的CFLAGS (在命令行上)放置-D_GNU_SOURCE 。 然后确保包含<signal.h><ucontext.h>

尝试使用32位,因为这些是32位模式值。 gcc -m32应该解决这个问题。

对我来说,这已经解决了:yum remove openssl-devel.x86_64 yum install openssl-devel.i686

在CentOS 6.4(x86_64)上

希望这可以帮助。