RedHat9.0:程序运行“段错误”,为什么连执行系统命令都出现“段错误”?

firza 2005-02-23 10:16:04
原来写的一个程序在系统中运行正常,但是拿到外面去用(同样是RedHat9.0,环境都是在家里设置好的)一段时间以后就出现这种现象了。原来运行正常的程序出现“段错误”,连执行系统命令 rpm -qa 都是提示段错误,如下:

[ux2000@localhost-jncrc ux2000]$ rpm -qa
段错误

原来也碰过这样的问题,连 ls 命令都出现段错误,和这次如出一辙,而且还要严重。我想应该是同一个原因导致的,请各位Linux的大侠帮忙,帮忙!!!!

在这里谢过了!
...全文
739 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
DanXer 2005-03-08
  • 打赏
  • 举报
回复
同意黑客说,我家里的linux就每天发现有大量的无聊的人使用各种口令登陆多种服务,如swat(sambad),telnetd,ftpd,nfsd,sshd,而且我的ip都是动态的(adsl),真不明白哪来这不多无聊的人和时间。幸好我的密码比较长且复杂。
重装如果也不能解决,建议更换cpu,和内存再次试一下。这个问题很难搞清,因为产生原因本身就可能是多方面的。
firza 2005-03-02
  • 打赏
  • 举报
回复
tell me why?
firza 2005-03-01
  • 打赏
  • 举报
回复
gettext(冰雪之崖) :
大侠,程序的bug会导致这样的结果吗?会破坏系统命令还是破坏共享库?系统重启以后内存应该会自动恢复正常了呀?
ckc 2005-03-01
  • 打赏
  • 举报
回复
安装过的包可以用rpm -V检查的
我一向用以下的脚本来检查所有的包是不是被更换
for i in `rpm -qa`
do
echo $i
sleep 5
rpm -V $i
done
注意察看这个脚本的输出,你会明白黑客改了你的什么程序
如果rpm也执行不了了那就有两个情况,一个是一些重要的共享库被破坏了,另一个就是黑客害怕你用rpm检查,所以破坏了你的rpm
一般来说黑客经常会更换你的ls,ps,who什么的,如果技术不过关,没换好,也许这些东西就不能用了
正常情况下你的这些程序还可以继续使用,只不过多了点功能而已
gettext 2005-03-01
  • 打赏
  • 举报
回复
找个内存检查工具查一下你的程序,你的程序有bug.
http://freshmeat.net/projects/efence/
ckc 2005-02-28
  • 打赏
  • 举报
回复
有可能是中招了
我以前也遇到过一次,后来发现是被人黑了
你试一下是不是ls,ps,这样的常用系统命令都不好用?
firza 2005-02-28
  • 打赏
  • 举报
回复
Ropyn(剑心)
你说得很有道理,我一直没有注意这个数值是否超大。

不过我现在又有一个疑问,就是Linux下面有没有什么磁盘坏道检查的工具?以前用过一个shell命令(badblocks),但是这个命令检查的结果是每个磁盘都返回一个相同的结果,结果描述不清楚,让人搞不清楚到底是不是磁盘有了坏道
firza 2005-02-28
  • 打赏
  • 举报
回复
ckc(火):
现在这个的情况是gdb和rpm这些命令用不了,但是ls这些命令还是能够用的。但是我也遇到过ls和ps命令用不了的情况,请问大侠是怎么发现是被黑了的,最后又是如何解决的呢?我一直都对这个问题愁眉未展,请给予指点,在这里多谢了!!!
firza 2005-02-25
  • 打赏
  • 举报
回复
等待指点
DanXer 2005-02-25
  • 打赏
  • 举报
回复
哦,忘了这个事,你的gdb都启动不了了,同样是SEGV。
不过从你执行gdb产生的输出上看,第二行 internal-error: virtual memory exhausted: can't allocate 1979711656 bytes。好像是gdb不能分配所需的虚拟内存。那个分配的字节数是(1979711656字节=1888M=1.84G)????!!! 怎么会申请这么大的内存呢?我们现在得出的结论是:SIGSEGV是由分配内存引发的,而且是出现在系统层次上。这样的话,我想无非就是两个,硬件:硬盘部分(swap分区的物理损坏),内存损坏。软件:linux核心映像是否已损坏。
nodummy 2005-02-25
  • 打赏
  • 举报
回复
重启先,如果不行的话,重新编译、安装核心
firza 2005-02-24
  • 打赏
  • 举报
回复
Ropyn(剑心) :
我也想过这个办法,但是gdb的调试程序根本就转不起来,以下就是执行过程:
[xxxxx@linux90 xxxxx]$ gdb
/usr/src/build/228201-i386/BUILD/gdb+dejagnu-20021129/gdb/utils.c:1062: internal-error: virtual memory exhausted: can't allocate 1979711656 bytes.
A problem internal to GDB has been detected. Further
debugging may prove unreliable.
Quit this debugging session? (y or n) y
Create a core file of GDB? (y or n) y
已放弃

gettext(冰雪之崖) :
不好意思,我不是很明白你的意思,内存被程序破坏了意味着什么呢?硬件故障还是内存溢出?
我重新启动机器后,但是还是会段错误,难道是硬件故障?
gettext 2005-02-24
  • 打赏
  • 举报
回复
可能是你程序的问题,把内存给破坏了。
firza 2005-02-23
  • 打赏
  • 举报
回复
getit911(Windows转Linux中) :
请问共享库文件是指哪个目录下的库文件?
getit911 2005-02-23
  • 打赏
  • 举报
回复
可能是共享库文件损坏,重装吧
tengulre 2005-02-23
  • 打赏
  • 举报
回复
mark
DanXer 2005-02-23
  • 打赏
  • 举报
回复
更正打开 core dump的命令是: #ulimit -c unlimited
firza 2005-02-23
  • 打赏
  • 举报
回复
我已经reboot两次了,但是问题依旧。
开始我怀疑是swap区的空间没有挂载成功,但是看了配置文件,证实没有问题

现在只能猜测是不是内存分配出现问题了。
DanXer 2005-02-23
  • 打赏
  • 举报
回复
段错误就是,非法访问非该应用程序可访问的内存。最典型的就是windows里边大家非常常见的那个窗口,"非法操作":-< 。Linux平台的这个错误完全同windows里的等价。
那么什么时候才会出现呢:比如说你把该程序运行所使用的某个动态链接库删除(windows可以区分不会真的去装载不存在的某个动态库),或者该动态库被安装了不兼容的版本,或者该应用程序所运行的代码遭到破坏(比如执行文件被毁坏),从而产生非法操作。

Linux平台下:技术上讲,段错误是由信号SIGSEGV(Segment Invalidate)所引起,当在保护模式下的应用程序访问一个不允许该进程访问的内存地址时(读写),CPU会触发硬件中断,该硬件中断由linux内核作为SIGSEGV发往应用程序,如果应用程序没有安装处理该信号的处理函数,进程对SIGSEGV的默认处理是在控制台打印"段错误"(英文环境"Segmentation Fault"),然后根据Bash的当前设置决定是否生成可调试的core文件(就是程序执行出错时的整个现场,包括内存环境和cpu寄存器状态,及调用堆栈现场),如果生成了core文件就可以用gdb精确定位出错所在的动态库模块,函数,以及访问哪个地址出错。core dump可以用命令打开(rh9默认好像是关闭的):#ulimit -c

根据你的状况很可能是系统的某个运行时库出现了错误,很可能像楼上说的动态库版本不对,或你安装了什么错误的公共库给系统,最常见的,libc.so,libm.so,libpthread.so,libstdc++.so,ld-linux.so。
找错的办法其实很简单:运行一个会出错的程序,然后找到产生的core文件,然后如下:
#gdb
>core <你执行产生的core文件>
>file <你执行的可执行程序全路径名>
>bt
看看错误出在什么地方。
gettext 2005-02-23
  • 打赏
  • 举报
回复
碰到过这样的问题,忘了怎么解决的了。先reboot一下把。
加载更多回复(4)

19,612

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧