附加调试器时不会出现的错误

时间:2010-05-17 10:00:07

标签: debugging fortran fortran90

我正在使用英特尔的FORTRAN编译器来编译数值库。测试用例在libc.so.6中提供了错误。当我连接英特尔的调试器(IDB)时,应用程序成功运行。如何调试调试器防止错误的错误?请注意,gfortran出现了同样的错误。

我在OpenSUSE 11.2 x64中工作。

错误是:

forrtl:severe(408):fort:(3):数组B的下标#1的值为-534829264,小于1的下限

2 个答案:

答案 0 :(得分:3)

错误消息对我很清楚,您正在尝试访问数组中不存在的元素。我怀疑使用未初始化的变量来识别数组中的元素时,值-534829264要么是垃圾,要么是整数算术溢出的结果。无论哪种方式,您都应该打开编译标志以强制进行数组边界检查并运行一些测试。我认为英特尔编译器的标志是-CB,但请查看文档。

至于为什么程序显然在调试器中成功运行,我无能为力,但是调试器可能会对运行时系统本身没有的变量施加一些默认值。或者其他一些因素完全是负责任的。

编辑:

运行时系统是否告诉您哪行代码导致问题?还有一些事情可以尝试诊断问题。使用编译器警告您

  • 在初始化之前使用变量;
  • 整数运算溢出(不确定编译器是否能发现这个?);
  • 任何强制转换从一种类型到另一种类型以及从同一种类型中的一种转换到另一种类型。

另外,请检查默认的整数大小是否符合预期,更重要的是,检查其余代码的大小。

答案 1 :(得分:1)

不是该领域的专家,而是需要考虑的几件事:

1)调试器是否首先将用作索引的变量初始化为零,但非调试没有,因此变量以“垃圾”值开头(有一个旧版本的Pascal用于执行此操作)

2)你在使用线程吗?如果是,那么调试会改变执行顺序,以便一些准备线程及时完成。