分段故障是如何报告的
How are segmentation faults reported?
我只是想知道如何报告分段错误。
- 这个过程会死,所以很明显它不能报告它
- 除非进程传递了一个信号,否则shell不会确定,这可能不是必然的情况
- 操作系统可能会做一些事情,但我不确定如何做
其中哪一个报告了分段错误(只是一个例子),以及如何报告?
这个过程会死,所以很明显它不能报告它
这实际上是错误的。可以安装一个SIGSEGV
处理程序来替换默认的处理程序,该处理程序只需转储核心并死亡。预加载库可以这样做来捕获分段冲突,并使用有限的可用设施在退出之前通知系统上运行的另一个进程发生了什么。
如果查看函数wait()
或waitpid()
,您会发现退出状态中的一个位表示核心转储。POSIX规范提到WIFSIGNALED
[sic]和WTERMSIG
以获得终止进程的信号。POSIX规范没有提到这一点,但例如在Mac OS X(10.7.4)上,有一个WCOREDUMP()
宏来测试是否创建了核心文件。
您可以有这样的代码,它将调用GDB命令来转储调用跟踪:
void BacktraceOnSegv() {
struct sigaction action = {};
action.sa_handler = DumpBacktrace;
if (sigaction(SIGSEGV, &action, NULL) < 0) {
perror("sigaction(SEGV)");
}
}
void DumpBacktrace(int) {
pid_t dying_pid = getpid();
pid_t child_pid = fork();
if (child_pid < 0) {
perror("fork() while collecting backtrace:");
} else if (child_pid == 0) {
char buf[1024];
sprintf(buf, "gdb -p %d -batch -ex bt 2>/dev/null | "
"sed '0,/<signal handler/d'", dying_pid);
const char* argv[] = {"sh", "-c", buf, NULL};
execve("/bin/sh", (char**)argv, NULL);
_exit(1);
} else {
waitpid(child_pid, NULL, 0);
}
_exit(1);
}
下面是一个支持更多平台的实现。
好吧,首先,当CPU试图访问进程无法访问的地址时,会发生分段故障。在最低级别,内存映射的实现必须检测到这一点,这通常会产生中断。内核接收该中断,并有一个其他代码段的地址表,每个代码段都用于处理该中断。
当内核接收到中断时,它会将其转换为一个特定的值(我说得很含糊,因为具体的细节随着硬件体系结构和内核实现的不同而不同)。SIGSEGV
通常被定义为具有值11,但确切的值并不重要;它在CCD_ 8中定义。
这时,信号值被传递到内核内的另一个表,该表包含"信号处理程序"的地址。其中一个处理程序位于由SIGSEGV
表示的偏移处。除非你已经做了一些更改,否则假设适当的限制允许,该地址通常是导致核心转储的例程的地址,但你可以用你自己的例程地址来代替它,它可以做任何你喜欢的事情。
- Android NDK传感器向事件队列报告奇怪的间隔
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 使用std::source_location报告错误的最佳实践
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 当用户超过按钮点击限制时报告
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 内存清理程序报告全局对象构造中未初始化值的使用
- QDataStream 读取和写入的字节数比 QFile::length() 报告要多
- 在 Linux 中使用 ioctl() 获取隐藏功能报告时,零字节消失
- Valgrind 在 std::string::swap 中报告 SIGILL
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 柯南,CMake.test()生成XML报告
- 如何构建一个异常类来报告C++中的哪些文件和行号?
- Valgrind 在 QThread::start() 上报告内存泄漏
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- 瓦尔格林德报告在 =带有嵌套shared_ptrs的运算符上的读取错误
- 为什么 valgrind 报告两个内存分配,而我的代码只请求一个?
- boost::p rogram_options 在指定意外的位置参数时不报告任何错误