加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

如何在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>会这样做的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读