Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在Linux 32位计算机上解决REG_EIP未声明(在此函数中首次使用)错误?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_616_1@

概述

我在使用 gcc编写用C语言编写的信号处理程序时遇到错误,在出现Segmentation fault之后显示转储的寄存器值.当我尝试使用代码访问它时: void print_registers(FILE *fd, ucontext_t *ctx, bool fpu = falsE) { const char *flags_str[] = { "CF"
我在使用 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: %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.)

并且所有寄存器都出现错误

我尝试了很多文件……但无法得到解决方案.
任何人都可以共享解决错误的详细信息.

感谢所有的回复

@L_772_14@

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

#define __USE_GNU
#include <ucontext.h>

您不需要包含< sys / ucontext.h>显式,< ucontext.h>会这样做的.

大佬总结

以上是大佬教程为你收集整理的如何在Linux 32位计算机上解决REG_EIP未声明(在此函数中首次使用)错误?全部内容,希望文章能够帮你解决如何在Linux 32位计算机上解决REG_EIP未声明(在此函数中首次使用)错误?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。