除了“CPU 的 MMU 发送信号”和“内核将其定向到违规程序并终止它”之外,我似乎找不到任何关于此的信息。
我认为它可能将信号发送到外壳,外壳通过终止违规进程和打印来处理它"Segmentation fault"。所以我通过编写一个我称之为crsh(废话 shell)的极简 shell 来测试这个假设。除了获取用户输入并将其提供给system()方法之外,此外壳不执行任何操作。
#include <stdio.h>
#include <stdlib.h>
int main(){
char cmdbuf[1000];
while (1){
printf("Crap Shell> ");
fgets(cmdbuf, 1000, stdin);
system(cmdbuf);
}
}
Run Code Online (Sandbox Code Playgroud)
所以我在一个裸终端中bash运行了这个 shell(没有在下面运行)。然后我继续运行一个产生段错误的程序。如果我的假设是正确的,这将 a) 崩溃crsh,关闭 xterm,b) 不打印"Segmentation fault",或 c) 两者兼而有之。
braden@system ~/code/crsh/ $ xterm -e ./crsh
Crap Shell> ./segfault
Segmentation fault
Crap Shell> [still running]
Run Code Online (Sandbox Code Playgroud)
回到第一个,我猜。我刚刚证明了不是外壳执行此操作,而是下面的系统。“分段错误”是如何打印出来的?“谁”在做?内核?还有什么?信号及其所有副作用如何从硬件传播到程序的最终终止?
我正在运行一个带有命令的 shell 脚本来连续运行几个内存密集型程序(2-5 GB)。当我回去检查我的脚本的进度时,我惊讶地发现我的一些进程是Killed,正如我的终端向我报告的那样。在后来Killed启动的程序之前已经连续完成了几个程序,但是之后的所有程序都因分段错误而失败(这可能是由于我的代码中的错误,也可能不是由于我的代码中的错误,请继续阅读)。
我查看了我正在使用的特定集群的使用历史记录,发现有人开始同时运行多个内存密集型进程,这样做耗尽了集群可用的实际内存(甚至可能是交换空间)。尽我所能,这些内存密集型进程在我的程序出现问题的同时开始运行。
一旦开始耗尽内存,Linux 是否有可能杀死我的程序?我后来遇到的分段错误是否可能是由于缺少可用于运行我的程序的内存(而不是我的代码中的错误)?
我有一个命令行应用程序,当运行时它没有做它应该做的事情,并且在某个时刻留下消息:
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
这是什么意思?我该怎么办?
当 Linux 出现段错误时,Segmentation fault (core dumped)会在终端(如果有)打印错误信息,并终止程序。作为 C/C++ 开发人员,这种情况经常发生在我身上,我通常会忽略它并转到gdb,重新创建我之前的操作以再次触发无效的内存引用。相反,我想我也许可以改用这个“核心”,因为一直运行gdb是相当乏味的,而且我不能总是重新创建分段错误。
我的问题是三个:
我目前正在运行一个执行系统发育 ANOVA 的统计建模脚本。当我分析完整数据集时,脚本运行良好。但是当我取一个子集时,它开始分析但很快因分段错误而终止。我无法通过谷歌搜索真正弄清楚这是否可能是由于我这边的问题(例如样本数据集太小以供分析)和/或脚本中的错误,或者这是否与我的 linux 系统有关。我读到它与将数据写入内存有关,但是为什么对于更大的数据集一切都很好?我试图使用谷歌查找更多信息,但这使它变得更加复杂。
感谢您提前澄清!
我有一个脚本调用一个程序(特别ttf2afm是 tetex 3.0 的一部分),该程序有时会出现段错误,有时不会。我需要的信息总是在出现段错误之前打印出来,但是我很难阻止管道重定向失败并且在程序失败时不向管道输出任何内容。
我尝试通过 FIFO 重定向,true在最后用括号括起进程,从 shell 函数执行并封装在 中sh -c,但脚本似乎从未让进程输出任何内容,重定向或以其他方式 - 甚至不输出到 stderr。
我知道它能够输出,因为它完全能够从命令行提供它,但由于某种原因不能从脚本提供。
我的问题是,脚本有没有办法忽略程序段错误并给我输出的事实?
我正在运行 BASH 4.1.10(2)-release。
我有一个 bash 脚本来测试一些程序,其中一个程序返回,Segmentation fault所以我试图在我的脚本的头部添加一个陷阱:
trap "echo 'segfault occured!'" SIGSEGV
Run Code Online (Sandbox Code Playgroud)
然而这并没有起到任何作用。我用了
echo $?
Run Code Online (Sandbox Code Playgroud)
就在产生段错误的程序之后,我得到139作为输出。如何为该特定错误代码添加陷阱?
(后续如何通过远程连接高效使用 3D?)
我在服务器上安装了 amd64 包,在客户端安装了 i386 包。按照用户指南,我在客户端上运行:
me@client> /opt/VirtualGL/bin/vglconnect me@server
me@server> /opt/VirtualGL/bin/vglrun glxgears
Run Code Online (Sandbox Code Playgroud)
这会导致段错误,vglconnect -s用于 ssh 隧道也不起作用。我也尝试了TurboVNC 方法,在那里开始vglrun glxgears工作,但我更喜欢使用 jpeg 压缩只传输应用程序窗口。问题是 32 <-> 64 位吗?或者我该如何解决问题?
这是 Ubuntu 9.04, 2.6.28-11-server, 32bit x86
$ cat test.c
main() { int *dt = (int *)0x08049f18; *dt = 1; }
$ readelf -S ./test
...
[18] .dtors PROGBITS 08049f14 000f14 000008 00 WA 0 0 4
...
$ ./test
Segmentation fault
$
Run Code Online (Sandbox Code Playgroud)
对于初学者:gcc.dtors在 elf 可执行文件中创建了一个析构函数段,在main()退出后调用。这个表长期以来一直是可写的,在我的情况下它看起来应该是(见readelf输出)。但是尝试写入表会导致段错误。
我意识到最近出现了一种面向只读 .dtors、plt 的运动,但我不明白的是readelfsegfault 和 segfault之间的不匹配。
自从最近对我的发行版 (PLD Linux) 进行重大升级以来,我一直在处理大量程序时遇到问题。据我所知,任何涉及 OpenGL 或 PulseAudio 段错误的内容。我正在使用专有的 nvidia 驱动程序和 3.2.x 内核。Xorg 本身运行良好,我能够运行大多数程序,但是诸如 mplayer segfault 之类的东西,任何程序都不会产生声音。
一旦我发现它可能与 OpenGL 相关,我就开始glxgears尝试使用它。自行运行它会立即出现段错误。然后我发现在下运行它strace运行良好。同样的事情也适用于mplayer。立即在测试 mp3 文件段错误上运行它,运行strace mplayer播放效果很好(尽管脉冲音频仍然消失并且它恢复为虚拟输出设备)。
如何运行某些东西来strace防止它出现段错误,我将如何继续调试这种情况?