vlc*_*vlc 4 c linux gcc signal-handling
我在使用gcc编写用C语言编写的信号处理程序时遇到错误,在出现Segmentation fault之后显示转储的寄存器值.当我尝试使用代码访问它时:
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]);
}
}
Run Code Online (Sandbox Code Playgroud)
我通过添加尝试了代码
#include<sys/ucontext.h>
Run Code Online (Sandbox Code Playgroud)
以及
#define _GNU_SOURCE
#ifndef REG_EIP
#define REG_EIP 0x23b46F
#endif
Run Code Online (Sandbox Code Playgroud)
但是,出现的错误是:
‘REG_EIP’ undeclared (first use in this function)
(Each undeclared identifier is reported only once for each function it appears in.)
Run Code Online (Sandbox Code Playgroud)
并且所有寄存器都出现错误
我尝试了很多文件......但无法得到解决方案.任何人都可以共享解决此错误的详细信息.
感谢所有的回复者
我相信你应该#define _GNU_SOURCE作为源文件的第一行,或者更好地放入-D_GNU_SOURCE你的CFLAGS(在命令行上).然后确保你包括<signal.h>和<ucontext.h>.
__USE_GNU 在包括之前尝试定义<ucontext.h:
#define __USE_GNU
#include <ucontext.h>
Run Code Online (Sandbox Code Playgroud)
你不需要<sys/ucontext.h>明确包括,<ucontext.h>会这样做。