LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 7250|回复: 10

Segmentation fault 的可能原因

[复制链接]
发表于 2007-6-1 16:02:06 | 显示全部楼层 |阅读模式
各位大侠,我是刚接触 linux 的,不得不在这个系统下调试 fortran 程序。由于时间很紧,强度很大,所以在网上搜了很多天也没有很大进展,现不得不求助各位大侠,告诉我下一步要怎么做,或者看些哪方面的书才能继续下去。
    是这样的,老师给了我一个fortran源程序,之前在 UNIX 下编译并成功运行过,现在我用的是 linux ,已经编译成功,但是运行就出错,先给出我的编译文件:

  1. [hujinhe@console ~]$ cat com
  2. mpif77 -g mdrdipord.f -c
  3. mpif77 -g libmd.f -c
  4. mpif77 -g dceign.f -c
  5. mpif77 -g mdrdipord.o libmd.o dceign.o -o mdord.exe
  6. [hujinhe@console ~]$
复制代码

运行结果如下:

  1. [hujinhe@console ~]$ ./mdord.exe <in.dip> out.out
  2. forrtl: severe (174): SIGSEGV, segmentation fault occurred
  3. Image              PC                Routine            Line        Source            
  4. mdord.exe          000000000041E998  Unknown               Unknown  Unknown
  5. mdord.exe          0000000000405C6A  Unknown               Unknown  Unknown
  6. mdord.exe          0000000000403074  Unknown               Unknown  Unknown
  7. mdord.exe          000000000040302A  Unknown               Unknown  Unknown
  8. libc.so.6          000000378851C4BB  Unknown               Unknown  Unknown
  9. mdord.exe          0000000000402F6A  Unknown               Unknown  Unknown
  10. [hujinhe@console ~]$
复制代码

所以我就学习用gdb调试,出现下面的情况:

  1. [hujinhe@console ~]$ gdb ./mdord.exe
  2. GNU gdb Red Hat Linux (6.3.0.0-1.96rh)
  3. Copyright 2004 Free Software Foundation, Inc.
  4. GDB is free software, covered by the GNU General Public License, and you are
  5. welcome to change it and/or distribute copies of it under certain conditions.
  6. Type "show copying" to see the conditions.
  7. There is absolutely no warranty for GDB.  Type "show warranty" for details.
  8. This GDB was configured as "x86_64-redhat-linux-gnu"...Using host libthread_db library "/lib64/tls/libthread_db.so.1".

  9. (gdb) run <in.dip> out.out
  10. Starting program: /export/home/hujinhe/mdord.exe <in.dip> out.out
  11. [Thread debugging using libthread_db enabled]
  12. [New Thread 182894224864 (LWP 13692)]

  13. Program received signal SIGSEGV, Segmentation fault.
  14. [Switching to Thread 182894224864 (LWP 13692)]
  15. 0x000000000041e998 in rand_ ()
  16. (gdb) backtrace
  17. #0  0x000000000041e998 in rand_ ()
  18. #1  0x0000000000405c6a in start () at mdrdipord.f:559
  19. #2  0x0000000000403074 in main$mdrdipord_$BLK () at mdrdipord.f:36
  20. #3  0x000000000040302a in main ()
  21. (gdb)
复制代码

为了学会调试程序,我把论坛上介绍的有关帖子都看了,发现文章很好,就是例子很少,我大概的命令都知道,就是不会实际应用,所以遇到上面的问题我就不知道怎么办了,大概知道是段错误,但怎么看具体错误出在哪?接下来我要怎么做?
 楼主| 发表于 2007-6-1 16:19:56 | 显示全部楼层
麻烦各位帮我看看是什么错误。
如果是堆栈或者是指针错误,我要怎么直知道具体在哪一行?怎么检查?
因为程序是老师写的,几千行,我还没研究明白。
一定要把老师的程序读明白,自己分析指针或者堆栈的信息么?
回复 支持 反对

使用道具 举报

发表于 2007-6-1 17:16:46 | 显示全部楼层
mdord.exe。。。Linux下能运行exe文件?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-1 18:18:54 | 显示全部楼层
不可以么?那我要怎么做啊?
回复 支持 反对

使用道具 举报

发表于 2007-6-1 22:05:00 | 显示全部楼层
楼主只是起了个扩展名而已, 生成的应该还是 linux 本地文件, 这个不碍事. 一般来说 Segmentation fault 都是由于内存的非法访问引起的. 在 C 语言中, 野指针, 数组越界, 内存溢出, 这都是极有可能出现的导致此错误的情况; 不正确的函数调用也常导致此错误. 不过 fortran 的情况就不知道了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-2 17:47:04 | 显示全部楼层

fortran源程序段

根据gdb的调试,是不是说明第36和559行有问题?
下面是源码

  1. (gdb) l 36
  2. 31      C
  3. 32      C     READ IN AND INITIALISE DATA.
  4. 33            CALL SYSDEF
  5. 34      C
  6. 35      C     SET UP STARTING CONFIGURATION
  7. 36            CALL START
  8. 37      C
  9. 38      C     PRINT OUT SYSTEM PARAMETERS
  10. 39            CALL OUTPUT(1)
  11. 40      C***********************************************************************
复制代码


第36行是调用子程序START,第559行是START子程序里的一部分,如下:


  1. (gdb) l 559
  2. 554           COMMON/CMVELO/VMOM(3,NSP),ANGM(3,NSP)
  3. 555           COMMON/CMFRCS/FXYZ(3,NSP),TXYZ(3,NSP)
  4. 556           DIMENSION XB(4),YB(4),ZB(4)
  5. 557           DATA XB/0.5,-.5,0.5,-.5/,YB/0.5,-.5,-.5,0.5/,ZB/0.5,0.5,-.5,-.5/
  6. 558     C     XRANF(IDUM)=2.0*RANF()-1.0
  7. 559           XRANF(IDUM)=2.0*RAND()-1.0
  8. 560           IDUM=0
  9. 561           IF(.NOT.NLRES)GO TO 10
  10. 562           CALL AGAIN(1)
  11. 563           GO TO 32
复制代码


可我还是看不出来是哪有问题,所以要请教各位大侠,不胜感激
回复 支持 反对

使用道具 举报

发表于 2007-7-1 20:25:05 | 显示全部楼层
只懂一点点c,所以帮不上忙
回复 支持 反对

使用道具 举报

发表于 2007-7-2 15:09:27 | 显示全部楼层
我写的程序经常都 Segmentation fault...
可能是pointer的问题…
回复 支持 反对

使用道具 举报

发表于 2007-7-2 20:55:40 | 显示全部楼层
Fortran,科学计算语言,呵呵,不懂的说。
可以加一些屏幕输出语句,看看哪一块错了。可能比用gdb还快
回复 支持 反对

使用道具 举报

发表于 2007-7-3 01:59:40 | 显示全部楼层
gdb is not easy to handle. I use ddd. Still it is not very good, but sometime it is enough.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表