调试断言失败:C# 应用程序中的 C++ 异常?
Posted
技术标签:
【中文标题】调试断言失败:C# 应用程序中的 C++ 异常?【英文标题】:Debug Assertion Failed: C++ exception in a C# application? 【发布时间】:2014-02-05 14:39:44 【问题描述】:我一直在管理和更新一个特定的应用程序。它很旧,我不是最初的开发者。多年来,它在其他小补丁中经历了几次调试会话。
过去几个月它一直运行稳定,但后来发生了一个让我觉得奇怪的异常。因为这只发生在发布模式的服务器上(它是一个服务器应用程序。)。
该应用程序是用 C# 编写的,在 Visual Studio 2012 Professional 中进行管理,并且发布为明确的 32 位 .NET 3.5,因为不幸的是服务器运行的是 Windows 2003。(我试图说服他们进行更新,以便我可以将应用程序更新到 .NET 4.5。但是,唉。)
所以我收到一条 C++ 调试消息。请参阅下面的屏幕截图。它出现在一个名为 vsprintf.c 的文件中,我猜在第 91 行。给我任何提示的唯一消息是格式!= NULL。
然而,这让我感到困惑。什么可能导致这种情况?在这种情况下,我最好采取哪些步骤进行调试?什么是“vsprintf.c”?
编辑:我设法在事件查看器中找到了一些东西。同时我会继续研究这个。
此致,
我。
【问题讨论】:
vsprintf
是一个标准函数。您需要检查调用堆栈。
感谢您的快速回复,但我无法在开发机器上重现此内容。在我自己查看之前,服务器管理员也重新启动了应用程序。
@Simple 他怎么能用断言来做到这一点?另一方面,与此同时,DavideNgueyen 似乎在重现该问题方面取得了一些进展......
【参考方案1】:
这是一个断言失败,即不满足您正在调用的函数的假设,在这种情况下,指针不为空。从外观上看,它是一个格式字符串。您是否直接使用格式字符串?如果是这样,看看那里。如果不是,这可能是内存泄漏问题,然后是内存不足故障。
【讨论】:
我通过查看 VM 管理器中的内存使用图形排除了它是内存泄漏 [+1] 猜猜猜! @DavideNguyen:那么你就可以在你的开发机器上重现这个 - 如果你产生足够的负载? 这不太可能,因为服务器机器的物理内存超过 16GB,虚拟机有 4GB 的内存。 (这已经足够了。)虽然我的开发系统有一个有效的 3GB 内存,因为它运行 Windows 7 32 位。我们为其他应用程序使用旧的 ODBC 驱动程序来与我们的石器时代的 UNIMS 数据源进行通信。奇怪的是,该错误是一次性错误,到目前为止还没有再次发生。我没有测试用例,在我们的并行测试环境中没有发生任何异常情况。 此外,应用程序被测量为在 .NET 默认最大内存内运行。我以前曾经遇到过这个问题,通过修复扩展它并解决了之前的内存膨胀。该应用程序在高峰时使用的内存不到 900 MB。 (它在公司内部有很多作用。) 这是一个记忆膨胀,是的。【参考方案2】:vsprintf
调用可能是由sprintf
和其他派生引起的,您应该检查所有这些调用。 (这也可以是字符串类的方法,正如我在 VCL 中看到的那样)。
如果错误不是由您使用的某个库引起的,那么 格式字符串参数中应该有一个NULL
(或0
),这主要是最后一个在原型中的...
之前。
如果您熟悉regular expressions,这在寻找模式时可能会有很大帮助。
【讨论】:
我正在审查代码,但我怀疑我会发现任何让我觉得奇怪的东西。 @DavideNguyen 您是否发现任何直接调用函数名称中带有sprintf
的函数?
不,完整的搜索没有显示任何对 sprintf 或 vsprintf 的调用。
@DavideNguyen 我明白了。您的应用程序是否使用格式化输出?
您的意思是 string.Format 函数以及 StringBuilder?在那种情况下,是的。它将数据库订单转换为我们导入 ERP 的 EDI 文本格式文件。以上是关于调试断言失败:C# 应用程序中的 C++ 异常?的主要内容,如果未能解决你的问题,请参考以下文章