我在Windows 7下使用英特尔fortran编译器2013和VS2010编译了一个fortran代码,它开始给我未处理的异常,但没有显示代码崩溃的行。通常会出现这样的错误:
Unhandled exception at 0x73e1d3d2 in GRIB2METEOriparto.exe: 0xC0000005: Access violation writing location 0x00240ef4....
并且调用堆栈只有dbghelp.dll或verifies.dll且没有可用的源。 我将我的源文件移动到Cygwin下,我使用gfortran编译了所有可能的警告/错误标志(包括检查边界和隐式接口),并且根本没有警告,程序运行顺利。所有接口都是明确的,因为我正在使用" CONTAINS"。因此,如果参数的数量不匹配,调试器会捕获它。没有未初始化的变量。 我回到VS2010,我做了一个清洁的解决方案"我重建了这个项目。代码开始在不同的C例程(我没写过)中崩溃,例如:
crt0.c at the line:
mainret = _tmain(__argc, _targv, _tenviron);
或
osinfo.c at line (if I well remember):
EnterCriticalSection( &(_pioinfo(fh)->lock) );
代码甚至没有到达第一行可执行代码(没有达到断点)。
我开始评论过去几天我最近添加的一些代码行,当运行该线程时,最终成功传递了少数第一行,并且在一个带有stackoverflow错误的子例程调用中崩溃了。这最终帮助我理解了这个问题。我有一堆字符声明为字符* 2560(在子程序和主代码中)。我用字符* 256替换它们并且它不再崩溃了。我重写了字符* 2560,我在链接选项中添加了标志/堆栈:2000000,现在一切运行顺利。我删除了我在这些代码行中添加的额外注释(在那里调用了错误的子程序,字符太多* 2560)并且一切运行顺利。我在Cygwin用gfortran重新编译了一切,一切都还不错。这是正常的吗?我现在安全吗?最初堆栈溢出错误由于某种原因被错误地解释为访问冲突?这可能吗?
编辑:这是我在主程序中的错误声明(我在其他子程序中有类似的(但更短)):
character*2560 DOScallINV,FORMdosCALLtxt,FORMdosCALLinv,filenam,FILEinv,provSTR,FMTtimeMETEO,&
TIMEstring,fmtGRID,fmtTIMEstring,FMTdataMETEO,WORKINGdir,path,DIRgribs,PATHgribs,&
DIRresultsRUN,PATHoutput,previousDIR,filePATH,PATHresultsRUN,PATHinputD3D,textFILE,&
newLINE,textFILE1,textFILE2,PATHlogs,LOGfile,LOGdir,ilineTXT,message,PATHresultsREST,&
LastRUNfolder,PATHobs,PATHopenda,PATHresultsRUNm1,workworkWITHnum,pathSTOBS,pathSTMOD,pathALG,&
toBEfound,COLLECTdirect,COLLECTdirectLOC,PATHwork,filePATHtot,filePATHlong,stringCAL,string,&
pathNM,filePATH_d3model,CDstring,toBEadded,stringCALini,filePATH_d3wrapper,fileWIND,dudFILE,stringL,stringU,fileWINDcal,&
PATHweb,pathREGR,fileWEB,PATHfileANALYSIS,threadFILE,threadFILEcopy