【问题标题】:How can I debug the cause of a 0xc0000417 exit code如何调试 0xc0000417 退出代码的原因
【发布时间】:2019-08-03 22:19:08
【问题描述】:

我在我的可执行文件(混合 Fortran/C)中收到退出错误代码 0xc0000417(转换为 STATUS_INVALID_CRUNTIME_PARAMETER),并尝试找出导致它的原因。尝试写入我推断的文件时似乎会发生这种情况,因为该文件已创建但其中没有任何内容。然而,我怀疑这不是 /real/ 原因。当我禁用从 C 代码完成的该文件的写入时,它会在写入不同的文件时崩溃,这次是从 Fortran 代码。

不幸的是:这只发生在程序(CPU 繁重的计算)运行大约 2-3 天后完成之后。当我尝试通过各种手段缩短计算时间以方便调试时,问题不再出现。似乎长时间的运行时间对于触发问题至关重要。

我尝试在 Visual Studio 2015 中运行它,但 VS 并没有中断/停止(就像发生了段错误一样),尽管已打开所有 C++ 异常的中断,就像在其他一些线程和所有常见问题中所建议的那样语言运行时异常。

我希望 VS 做的是在“产生”错误代码时中断并检查变量的值,或者至少获取堆栈跟踪。

我进行了深入搜索,但找不到满意的解决方案。从本质上讲,我的问题类似于how to debug "Invalid parameter passed to C runtime function"?,但我的程序的 linux 版本不会出现问题,所以我正在寻找有关如何在 Windows 上使用 Visual Studio 或其他工具进行调试的指导。

编辑: 遗憾的是, 无法找到任何方便的方法来在错误发生时自动中断。因此,我采用手动方式在假定的崩溃附近设置断点(在 VS 中)并逐步执行代码。 原来我从 fopen 得到了一个 NULL 指针:

myfile = fopen("somedir\\somefile.xml");

尽管正在创建文件。但是当尝试写入该文件时(通过 NULL 句柄!),发生了段错误。奇怪的是,当进程的生命周期很长时,我似乎只从 fopen 获得了一个 NULL 指针。但这与那个问题无关。

编辑 2: 检查全局 errno 变量给出了错误代码 22,它再次转换为无效参数。但是,fopen 的参数 not 无效,因为我使用调试器验证了 文件实际上是正确创建的(长度为 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 本身,而是我正在使用的英特尔 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 的补丁版本修复了问题,即在格式化写入期间句柄计数不再增加。

【问题讨论】:

  • 关于 我进行了深入的搜索... 我很欣赏有时在多次尝试为 Google 搜索找到正确的查询字符串之后,正确的响应似乎永远不会流行音乐。在这种情况下,我在 Visual Studio 上使用了 STATUS_INVALID_CRUNTIME_PARAMETER,前两个链接是我上面评论的两个链接。
  • 在发布之前我已经检查了您链接的所有文章,但我没有成功调试。我唯一能做的就是在假定的崩溃附近的某个地方设置一个断点。现在,3 天后,我终于找到了原因:尽管创建了文件,但 fopen("somedir\\somefile.xml","w") 返回一个 NULL 指针。但这是一个不同的问题。
  • 好吧,如果这是一段时间后发生的事情,您可能会遇到以下问题:地址空间碎片(因此某些分配注定会失败),内存泄漏(结果相同),竞争条件(导致不一致/损坏状态),一些重要的索引/计数/指针溢出,内存损坏。

标签: c visual-studio debugging runtime-error


【解决方案1】:

可能是打开的文件过多或句柄泄漏(未关闭)。你可以用例如检查。 Process Explorer(我想你可以用它看到进程中的句柄数)。

【讨论】:

  • 事实证明这是英特尔运行时库中的一个已知(且已修复)错误:software.intel.com/en-us/forums/…。使用修补的 libifcoremd.dll 修复了问题,句柄表现良好(o;
猜你喜欢
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 2011-01-11
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2018-07-18
相关资源
最近更新 更多