我在可执行文件(混合的Fortran / C)中得到退出错误代码0xc0000417(转换为STATUS_INVALID_CRUNTIME_PARAMETER),然后尝试找出导致它的原因。尝试写入我推断的文件时似乎会发生这种情况,因为该文件已创建但其中没有任何内容。但是我怀疑不是/ real /原因。当我禁用用C代码完成该文件的写入时,这一次写入其他文件时会因Fortran代码而崩溃。
不幸的是:这仅在程序运行了大约2-3天后(CPU大量计算)完成后才发生。当我尝试通过各种方法来缩短计算时间以方便调试时,此问题不再发生。似乎长时间运行对于触发问题至关重要。
我尝试在Visual Studio 2015中运行它,但VS并未中断/停止(就像发生了段错误一样),尽管它已打开了所有C ++异常的中断,就像在其他一些线程和所有Common中建议的那样语言运行时异常。
我希望VS做的是要么在“产生”该错误代码时中断,然后检查变量的值,要么至少获取堆栈跟踪。
我进行了深入的搜索,但是找不到解决我问题的令人满意的解决方案。从本质上讲,我的问题类似于how to debug "Invalid parameter passed to C runtime function"?,但该问题在我的程序的linux版本中不会发生,因此我正在寻找有关如何在Windows上使用Visual Studio或其他工具进行调试的指导。
编辑: 可悲的是, I 找不到错误发生时自动中断的任何便捷方法。因此,我采用了手动设置断点(在VS中)的方法,并逐步执行了代码。 原来我从fopen得到了一个NULL指针:
myfile = fopen("somedir\\somefile.xml");
尽管正在创建文件。但是,当尝试写入该文件时(通过NULL句柄!),发生了段错误。奇怪的是,当进程的生存期较长时,我似乎只能从fopen获取NULL指针。但这是那个问题的题外话。
修改2:
检查全局errno
变量会给出错误代码22,该错误代码再次转换为无效参数。但是,fopen的参数不是无效,因为我已通过调试器进行了验证,并且文件实际上已正确创建(长度为0字节)。现在,我认为错误代码22只是误导,因为当我检查(通过VS中的手表)$err, hr
时,我得到:
0x000005aa ERROR_NO_SYSTEM_RESOURCES : Insufficient system resources exist to complete the requested service.
就像提到的here一样,我有足够的HD空间(1.4 GB),足够的可用RAM(3.2 GB),并且我担心这不是我的程序直接引起的,而是Windows损坏导致的设计文件处理(在Linux中不会发生)。
编辑3:好吧,似乎不是罪魁祸首是Windows本身,而是我正在使用的Intel Fortran编译器。每次我在程序中执行格式化的写语句时,都会泄漏Mutant(Windows表示互斥体)句柄。使用WinDbg和!htrace -enable
,然后再运行一些,中断并发出!htrace -diff
,可以得到这些回溯的负载:
0x00000000777ca25a: ntdll!NtCreateMutant+0x000000000000000a
0x000007fefd54a1b7: KERNELBASE!CreateMutexExW+0x0000000000000057
0x000007fefd551d60: KERNELBASE!CreateMutexExA+0x0000000000000050
0x000007fedfab24db: libifcoremd!for_lge_ssll+0x0000000000001dcb
0x000007fedfb03ed6: libifcoremd!for_write_int_fmt+0x0000000000000056
0x000000014085aa21: myprog!MY_ROUTINE+0x0000000000000121
在程序运行期间,这些突变体句柄似乎会累积,直到它们耗尽所有句柄资源(16711680句柄),以便文件句柄没有剩余。
编辑4:这是intel fortran运行时库中的一个错误,已在更高版本中修复(请参见here)。使用libifcoremd.dll
的修补版本可以解决此问题,即在格式化写入过程中句柄数不再增加。
答案 0 :(得分:0)
打开的文件过多或句柄泄漏(未关闭)。您可以使用例如进程浏览器(我认为您可以使用它查看进程中的句柄数量)。