2

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

我在 OpenSUSE 11.2 x64 中工作。

错误是:

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

4

2 回答 2

3

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

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

编辑:

运行时系统没有告诉您是哪一行代码导致了问题吗?尝试诊断问题的更多内容。使用编译器警告您

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

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

于 2010-05-17T10:28:58.040 回答
1

不是该领域的专家,但有几点需要考虑:

1)调试器是否首先将用作索引的变量初始化为零,但非调试没有,因此该变量以“垃圾”值开头(旧版本的 Pascal 曾经这样做过)。

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

于 2010-05-17T10:29:44.077 回答