Questions tagged «segmentation-fault»

当硬件将内存访问冲突通知类似Unix的操作系统时,就会发生分段错误(通常简称为segfault)或总线错误。

4
Segmentation Fault在后台如何工作?
除了“ CPU的MMU发送信号”和“内核将其定向到有问题的程序,终止它”之外,我似乎找不到任何其他信息。 我以为它可能会将信号发送到外壳,外壳通过终止有问题的进程和打印来处理它"Segmentation fault"。因此,我通过编写一个极小的shell (称为crsh(废话外壳))测试了该假设。该外壳程序不执行任何操作,只是接受用户输入并将其输入给system()方法。 #include <stdio.h> #include <stdlib.h> int main(){ char cmdbuf[1000]; while (1){ printf("Crap Shell> "); fgets(cmdbuf, 1000, stdin); system(cmdbuf); } } 因此,我在一个裸终端(没有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] 回到正方形,我猜。我刚刚演示了执行此操作的不是外壳程序,而是其下的系统。甚至如何打印“细分故障”?“谁”在做?内核?还有吗 信号及其所有副作用如何从硬件传播到程序的最终终止?

2
Linux是否会在不询问内存是否不足的情况下开始杀死我的进程?
我正在运行带有命令的Shell脚本,以命令背对背运行多个内存密集型程序(2-5 GB)。当我回过头来检查脚本的进度时,我惊讶地发现我的某些进程正在运行Killed,就像我的终端向我报告的那样。在随后Killed启动的程序之前,已经先后完成了一些程序,但是此后所有程序都因分段错误而失败(这可能是由于我的代码中的错误所致,也可能不是,请继续阅读)。 我查看了正在使用的特定群集的使用历史记录,发现有人开始同时运行多个内存密集型进程,并且这样做耗尽了该群集可用的实际内存(甚至交换空间)。尽我所能,这些内存密集型进程大约在我的程序出现问题的同时开始运行。 一旦内存开始耗尽,Linux是否有可能杀死我的程序?以后出现的分段错误是否可能是由于缺少可用于运行程序的内存(而不是代码中的错误)引起的?


4
分段错误(核心已转储)-到哪里?它是什么?为什么呢?
在Linux中发生分段错误时,错误消息Segmentation fault (core dumped)将打印到终端(如果有),并且程序将终止。作为C / C ++开发人员,这种情况经常发生在我身上,我通常忽略它并继续前进gdb,重新创建我以前的操作,以便再次触发无效的内存引用。取而代之的是,我认为我也许可以改用这个“核心”,因为一直运行gdb很繁琐,而且我不能总是重新创建分段错误。 我的问题是三个: 这个难以捉摸的“核心”在哪里倾销? 它包含什么? 我该怎么办?

2
段故障处理程序的管道输出
我有一个脚本,该脚本调用ttf2afm有时会出现段错误而有时没有的程序(特别是tetex 3.0的一部分)。我需要的信息总是在段错误之前被打印出来,但是我很难阻止管道重定向失败,并且在程序失败时不向管道输出任何内容。 我尝试过通过FIFO进行重定向,true最后用a括住该过程,从shell函数执行并封装在中sh -c,但是脚本似乎从未允许该过程输出任何东西,无论是重定向还是以其他方式输出-甚至不输出到stderr。 我知道它能够输出,因为它完全有能力从命令行提供它,但是出于某种原因却不能从脚本中提供。 我的问题是,脚本是否可以忽略程序段错误并给我输出的事实? 我正在运行BASH 4.1.10(2)-发行版。


2
.dtors看起来可写,但尝试编写segfault
这是Ubuntu 9.04、2.6.28-11-server,32位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 $ 对于未初始化的对象:gcc .dtors在elf可执行文件中创建一个析构函数段,该段在main()退出后调用。该表长期可写,在我看来,它应该是可写的(请参阅readelf输出)。但是尝试写入表会导致段错误。 我知道最近有一种向只读.dtors前进的趋势,但是我不明白的是,段之间的不匹配readelf。

1
尝试通过virtualGL运行glxgears时出现分段错误
(有关如何通过远程连接有效使用3D的后续内容?) 我在服务器上安装了amd64软件包,在客户端上安装了i386一个软件包。遵循用户指南,我在客户端上运行此命令: me@client> /opt/VirtualGL/bin/vglconnect me@server me@server> /opt/VirtualGL/bin/vglrun glxgears 这会导致segfault,vglconnect -s用于ssh隧道也不起作用。我还尝试了TurboVNC方法,该方法可以在启动时vglrun glxgears起作用,但是我更喜欢使用jpeg压缩仅传输应用程序窗口。问题是32 <-> 64位吗?或者我该如何解决?

4
运行strace如何解决我的OpenGL问题?
自从最近对我的发行版(PLD Linux)进行重大升级以来,我一直在处理大量程序。据我所知,任何涉及OpenGL或PulseAudio段错误的内容。我正在使用专有的nvidia驱动程序和3.2.x内核。Xorg本身运行良好,我能够运行大多数程序,但是mplayer segfault之类的东西并且任何程序都不会发出声音。 一旦确定它可能与OpenGL有关,便开始glxgears进行测试。单独运行它会立即出现段错误。然后我发现在下运行它strace很好。同样的道理对于mplayer。立即在测试mp3文件segfault上运行它,运行strace mplayer播放就很好了(尽管脉冲音频仍然消亡,并且它恢复为虚拟输出设备)。 如何在某些情况下运行某些东西以strace防止它出现段错误,我将如何继续调试情况?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.