如何在Linux 32位计算机上解决REG_EIP未声明(在此函数中首次使用
发布时间:2020-12-14 01:21:51 所属栏目:Linux 来源:网络整理
导读:我在使用 gcc编写用C语言编写的信号处理程序时遇到错误,在出现Segmentation fault之后显示转储的寄存器值.当我尝试使用代码访问它时: void print_registers(FILE *fd,ucontext_t *ctx,bool fpu = false){ const char *flags_str[] = { "CF","PF","AF","ZF",
我在使用
gcc编写用C语言编写的信号处理程序时遇到错误,在出现Segmentation fault之后显示转储的寄存器值.当我尝试使用代码访问它时:
void print_registers(FILE *fd,ucontext_t *ctx,bool fpu = false) { const char *flags_str[] = { "CF","PF","AF","ZF","SF","TP","IF","DF","OF","NT","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: %in" "eax: %08xtebx: %08xtecx: %08xtedx: %08xn" "esi: %08xtedi: %08xtebp: %08xtesp: %08xn" "cs: %04xtgs: %04xtfs: %04xn" "ds: %04xtes: %04xtss: %04xn",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.) 并且所有寄存器都出现错误 我尝试了很多文件……但无法得到解决方案. 感谢所有的回复者 解决方法
在包含< ucontext.h之前尝试定义__USE_GNU:
#define __USE_GNU #include <ucontext.h> 您不需要包含< sys / ucontext.h>显式,< ucontext.h>会这样做的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |