我正在使用英特尔的 FORTRAN 编译器来编译一个数值库。测试用例在 libc.so.6 中提供了错误。当我附加英特尔的调试器 (IDB) 时,应用程序成功运行。如何调试调试器阻止错误的错误?请注意,gfortran 也出现了相同的错误。
我在 OpenSUSE 11.2 x64 中工作。
错误是:
forrtl:严重(408):fort:(3):数组 B 的下标 #1 的值 -534829264 小于 1 的下限
错误消息对我来说很清楚,您正在尝试访问一个不存在的数组元素。我怀疑值 -534829264 在您使用未初始化的变量来识别数组中的元素时是垃圾,或者是整数算术溢出的结果。无论哪种方式,您都应该打开编译标志以强制检查数组边界并运行一些测试。我认为英特尔编译器的标志是-CB
,但请查看文档。
至于为什么程序显然在调试器中成功运行,我无能为力,但也许调试器对运行时系统本身没有的变量施加了一些默认值。或者其他一些因素完全是负责任的。
编辑:
运行时系统没有告诉您是哪一行代码导致了问题吗?尝试诊断问题的更多内容。使用编译器警告您
此外,检查默认整数大小是否符合您的预期,更重要的是,检查其余代码的预期大小。
不是该领域的专家,但有几点需要考虑:
1)调试器是否首先将用作索引的变量初始化为零,但非调试没有,因此该变量以“垃圾”值开头(旧版本的 Pascal 曾经这样做过)。
2)你在使用线程吗?如果是这样,调试会改变执行顺序,因此一些准备线程会及时完成。