艰难的Linux开发!怎比Unix!难道Linux的稳定性是炒出来的?
为什么总会出现"sigmentation fault"和"command terminated"?
我正在将应用系统从Sco Openserver5.0.5移植到Redhat7.2上,遇到不可思议的问题,也许是我在Linux还是入门甚浅。
(1)在SCO上,makefile中编译命令如下例:
cc -o app app.o ...... -lx -lnsl_l ......
无论是Pentium、PII、PIII机器,编译出来的运行时系统都运行稳定健壮。
(2)在Redhat上,makefile中编译命令如下例:
gcc -o app app.o ...... -mlarge -O3 -march=pentium -lnsl .......
Pentium机器,运行时总会出现"segmentation fault"或"command terminated",然后退出。
出现这个问题的地方还不定,有时在这里,有时在那里。
奇怪的是,有时程序出错退出的地方,加一些printw、getch语句停顿一下,就能过去了,但在其他地方肯定有另一问题等在那里。
用gdb调试发现进程是收到一个SIGSEGV信号后退出的,有时在malloc过程中收到该信号,有时又在strcmp过程中收到。
在SCO上,程序运行的状态是可预料的,有错误就一定是人的错误,调试时甚至不用工具,只在程序中加些printf语句,定位错误,排除后同样的问题就不会再出现。
而在Redhat上,一切是那么不可预料,明明排除了一个问题,下一次排除其他问题后,在同一地方同样的问题还会再出现。
难道Linux的稳定性是炒出来的,根本名不副实?还是我没入门呢?
如果是后者,快请此中高手指点迷津。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
Linux 的稳定性是相对的,要是真的那么100%可靠,还会有人花钱去买SCO吗?
但最近几个版本 Linux 的稳定性越来越好了,所以 SCO 才想办法要让 Linux 也成为付钱的。这样SCO才会有的混。
你的编译过程要没错的话,你能不能保证那台Linux的机器没问题。因为我不懂编程,但要是内存有问题的话,可能也会有 Segmentation fault 吧。
你自己的程序选择用-O3编译,不合适自找不可预测的结果吗?呵呵。尤其如果你的gcc版本比较怪异。
移植本身就有比开发更困难的因素,更况且你都说你自己对linux并不了解,你指望linux和sco的兼容性好到什么地步呢?另外编译参数也很重要
问题我已经解决了,还是自己程序中指针导致的错,有时换一种写法就通过了,比如,原来用循环移动指针,内存出错,改用指针加法就通过了,其中原因还不清楚。
谢谢各位的热心回帖。
gcc作编译时,最好不要加优化参数,尤其是优化过度时,会出现一些难以解释的问题
-O2 还是可以用的,如果对自己的程序有信心,也可以用-O3。比如mysqld
也许正是因为KERNEL的不同才导致的这样的问题
这种情况绝大多数是你的程序写得有问题,不是OS的稳定性问题。从你这种思路来看,你确实对linux不太熟悉,对其他unix也不见得有多熟悉
1)segment fault: 我想楼主可能是跨kernel和user space引用了。在kernel空间直接访问user 空间的数据,偶尔是可以的,但是这是错误的,是出现 segment fault可能的原因之一。
2)对于加入打印信息而使得程序正常运行。我想需要考虑printk, printf是否可能影响程序的时序,我遇到过一种情况,打印带回车符的printk就能够正常工作,后来发现这个printk相当于一个cache_writeback过程。