linux - 在段错误 : Is there a way, 之后检查指针是否仍然有效?

标签 linux gcc g++ segmentation-fault

我计划创建一个日志记录/跟踪机制,将字符串文字的地址 (const char*) 写入环形缓冲区。这些字符串位于只读数据段中,由预处理器使用 __function____file__ 创建。

问题:如果所有指针都有效,是否有可能在段错误后分析此环形缓冲区内容?对于“有效”,我的意思是它们指向映射的内存区域并且取消引用不会导致段错误。

我正在使用 Linux 2.6.3x 和 GCC 4.4.x。

最好的问候,

查理

最佳答案

我认为您正在寻找的方法是通过 sigaction 处理 SIGSEGV 信号.

void handler(int, siginfo_t *info, ucontext_t *uap)
{
   /* Peek at parameters here...  I'm not sure exactly what you want to do. */
}

/* Set up the signal handler... */

struct sigaction sa, old_sa;
memset(&sa, 0 sizeof(sa));

sa.sa_sigaction = handler;
sa.sa_flags = SA_SIGINFO;

if (sigaction(SIGSEGV, &sa, &old_sa))
{
   /* TODO: handle error */
}

但是请注意,在您自己的进程中捕获 SIGSEGV 有点奇怪。该过程可能处于无法恢复的不良状态。您可以针对它执行的操作可能是有限的,进程被终止很可能是一件好事。

如果你想让它更稳定一点,可以使用 sigaltstack允许您指定备用堆栈缓冲区的调用,因此,如果您已完全清理堆栈,您仍然可以处理 SIGSEGV。要使用它,您需要在上面的 sa.sa_flags 中设置 SA_ONSTACK

如果你想从另一个进程的安全性响应 SEGV(从而将你自己与行为不佳的段错误代码隔离开来,这样你就不会在检查它时崩溃),你可以使用 ptrace .这个接口(interface)比较复杂,有很多不可移植的部分,主要用来写调试器。但是您可以用它做一些很棒的事情,比如读写进程的内存和寄存器,以及改变它的执行。

关于linux - 在段错误 : Is there a way, 之后检查指针是否仍然有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4401193/

相关文章:

c - m68k-elf 目标是否支持 GCC 内联 asm goto?

c - 如果传递了冲突的编译器标志,GCC 会如何表现?

c++ - 链接器找不到 mathgl 库

linux - curl (58) 无法加载客户端证书 -8912

linux - 检查字符串是否包含命令?

linux - 将一个文件(保持行顺序)与 "static"文件进行比较

c - 为什么 gcc 的开关生成的跳转比等效的函数调用更快但只有静态链接?

c++ - C++中的尾递归

c++ - undefined reference (g++ 静态库编译)

java - matlab中有什么办法可以放大菜单栏和提示窗口的字体