gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:17 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com