我计划创建一个日志记录/跟踪机制,将字符串文字的地址 (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/