visual-studio - 调试期间算术下溢或上溢异常

标签 visual-studio debugging exception random

这是奇怪行为的一天。
我们有一个用 Delphi 2007 制作的 Win32 项目,它承载 .NET 运行时并调用 .NET 以显示新表单,作为过渡期的一部分。
最近,我们开始在代码的看似随机的位置和点处遇到异常:算术上溢或下溢。
其中之一的堆栈跟踪如下所示:

at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.RunDialog(Form form)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()
at Gatsoft.Gat.UI.Windows.Forms.Remanaging.RemanageForm.DelphiOpenInNewMode(String employeeCode, String departmentCode, DateTime date) in C:\Dev\VS.NET\Gatsoft\Gatsoft.Gat.UI.Windows\Forms\Remanaging\RemanageForm.Delphi.cs:line 67
在 Visual Studio 解决方案中,最外层的类库之一(即拉入它所能提供的所有引用)已经设置了一个特定的调试程序,以 Delphi 项目输出为目标。这允许我们从 Visual Studio 调试 .NET 代码,即使程序的主要部分是用 Delphi 编写的。
只有在从调试器运行时才会出现问题,如果我们直接运行 exe 文件(通过资源管理器、快捷方式,甚至 Visual Studio 中的 Ctrl+F5),则不会出现问题。
机器上显然没有 spy 软件(正如 this 所暗示的那样)。
还有什么我们可以检查的吗?

编辑:看起来 .NET 调试器启用了这个 SNaN 标志,而 Delphi 调试器没有。我们将不得不对此进行进一步调查,但现在我会接受 @Lorenzo Boccaccia的回答。
显然已解决
好的,看起来我们终于解决了这个问题。对于我们的测试人员来说,在没有连接调试器的情况下问题就开始发生了,所以我们必须优先考虑问题。
最后,我们发现了出现问题的机器的一个常见问题,它们是配备 NVIDIA Quadro NVS 110M 的戴尔 Lattitude D620 笔记本电脑,其旧驱动程序来自用于配置笔记本电脑的系统镜像,早在 2006 年。
我在网上找到了一篇文章,尽管我在重新启动以更新显示驱动程序时丢失了 url,这导致 .NET 服务崩溃,主要是当机器忙于在屏幕上执行某些操作时。重现他的问题的一种方法是打开命令提示符到 C:\并执行 DIR /S只是强制进行大量屏幕更新,这会触发崩溃。
他也有一块 NVIDIA 显卡。
我的机器上的问题大约每启动 2-4 次我们的程序就会出现一次,但是在更新视频驱动程序后,我已经成功启动了 123 次,没有任何问题。 (顺便说一句,我可以推荐 AutoHotKey 用于此类事情)。
所以看起来我们找到了罪魁祸首,一个旧的/有问题的 NVIDIA 驱动程序。
更新了这个问题,以便将来有人可以节省一些时间。
现在,如果你能原谅我,我要去角落哭。
被诅咒了!
我一定是惹祸了。更新视频驱动程序后,我刚发布上述更新,同事的笔记本电脑就失败了。
不过,我很确定它现在是我们应用程序之外的一个问题,因此只需要弄清楚要更新哪些特定内容。

更多更新 : 好的,我的机器现在显然是固定的,我同事的机器不是这样。到目前为止,我们已经更新了 BIOS、芯片组驱动程序,目前适用于 XP 的 SP3 即将推出。
今晚将进行老化测试,应用程序将在夜间启动,因为问题在启动期间或第一次执行某些 WinForms .NET 代码时出现。这个应用程序主要是一个Delphi Win32应用程序,但它承载了.NET运行时,问题似乎与.NET代码有关。当我们“启动” .NET 运行时,问题可能会出现,或者当我们从 Win32 启动第一个 .NET 窗口时,它也会出现。

从统计上讲,我现在准备发布此代码。一夜之间,该应用程序已启动 3051 次而没有出现错误,而在我更新视频驱动程序之前,它每 2-4 次崩溃一次。
刺激并发现(!/?)
这种修复错误的折磨感觉就像去看医生一样,随后发生了以下对话:
Doc: Does this hurt?
Me: No...
Doc: What about now?
我已经刺激并戳了应用程序,最后我想我发现了一些我们所做的引入了这个问题的事情。
在我们的应用程序中,我们从 Delphi 2007 Win32 应用程序托管 .NET 运行时,在我们的胶水代码中,我们有以下行(现在):
  rc := CorBindToRuntimeEx('v2.0.50727', 'wks',
  STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN or STARTUP_CONCURRENT_GC,
  @clsid, @iid, UnkRuntimeEngine);
中间的两个常量原本只是一个 0,意思是选择默认值。此更改是在几个月前引入的,此后问题一直在慢慢蔓延到我们身上。引入此更改是为了鼓励 ANTS 分析器加载我们的 Win32 应用程序 + 托管的 .NET 运行时以进行性能分析,而我们当时引入的更改使该工作得以实现。此外,算术上溢/下溢的问题逐渐恶化,所以我敢打赌这个问题在更改后有一段时间没有出现,所以它不归因于我们所做的任何更改。
此外,由于我们(最初)在运行调试器时才看到问题,我们认为 Visual Studio 和/或 Delphi 有问题。
无论如何,现在统计,在一个屏幕上的浏览器由 javascript 触发重复上下滚动(显然需要以触发错误),然后我已经能够成功启动应用程序 726 次,调用中的值为 0 ,并且它在 17 次中有 5 次崩溃,其中有两个常量。
Doc: Does this hurt?
让我们先不讨论是谁做出了这种改变。我确定罪魁祸首想匿名……咳

最佳答案

链接的 dll 的调试版本可以通过信令 nan 支持编译,参见 http://blogs.msdn.com/oldnewthing/archive/2008/07/02/8679191.aspx对于这个问题的一个例子。

heisenbug 是由未初始化的变量引起的,这里可能有一个链接的 dll 启用了 cpu 的 snan 功能,并在返回时忘记禁用它

关于visual-studio - 调试期间算术下溢或上溢异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56655/

相关文章:

debugging - Xamarin 调试在新创建的项目上损坏导致终止读取 : Bad file descriptor

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

java - 在Java中,我有一个名为字符串 "A"(大小1)的字符串。为什么 string.substring(1) 没有给出异常

c - Visual Studio 编写 C 时出现 "Unable to start program...system cannot find the file specified"错误

visual-studio - SSIS 包中的平面文件连接管理器显示 "Valid File Name Must be Selected"

c# - Visual Studio ~ 测试项目找不到被测项目的命名空间

c# - .NET : Version string number and length with ClickOnce

安卓工作室 3.3.1 :Some breakpoints are shown without the tick and not being hit

java - 连同堆栈跟踪一起序列化 java.lang.Throwable,导致链和相关堆栈跟踪

java - 比 jdb 更好的 Java 远程调试器?