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