如何调试0xc0000417退出代码的原因

时间:2019-03-13 09:35:49

标签: c visual-studio debugging runtime-error

我在可执行文件(混合的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得到了一个N​​ULL指针:

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的修补版本可以解决此问题,即在格式化写入过程中句柄数不再增加。

1 个答案:

答案 0 :(得分:0)

打开的文件过多或句柄泄漏(未关闭)。您可以使用例如进程浏览器(我认为您可以使用它查看进程中的句柄数量)。