LabVIEW在调用image.cpp或drawmgr.cpp因为DAbort而崩溃

更新 Mar 28, 2024

适用于

软件

  • LabVIEW

问题详述

  • 我的 LabVIEW 程序因image.cpp或drawmgr.cpp中的错误而崩溃
  • 我正在通过cRIO-9034运行独立的LabVIEW应用程序,但它因drawmgr.cpp中的错误而崩溃
  • 我在 Windows 任务管理器中注意到LabVIEW使用的GDI对象数量接近10,000
  • 错误发生的时间不一致
  • 这些可能发生在VI编辑模式下、运行时和LabVIEW启动期间

解决方案

  • 尝试减少前面板对象的数量。
    • 这将有助于减少LabVIEW使用的GDI对象的总量。
    • 如果在运行VI时GDI对象随着时间的推移而增加,请检查VI中的递归元素,这些元素可能会在前面板上重复渲染对象。为此,您可以在Windows任务管理器中跟踪GDI对象的使用情况(请参阅下面的附加信息)。
  • 更改 GDI 对象句柄的限制。MSDN:GDI Objects (Windows) 中描述了一种在 Windows(2000 年后)中增加GDI对象数量的方法。
  • 安装显卡厂商提供的最新显卡驱动程序。这通常会修复导致 GDI 溢出的内存泄漏。
  • 更改选板加载设置。
    1. 在任何LabVIEW窗口中,在顶部菜单栏导航至工具»选项...
    2. 这将会打开选项窗口。导航到控件/函数选板。
    3. 在顶部有加载选项,选择在需要时加载选板以尝试减轻崩溃。
image.png
  • 在<LabVIEW>\user.lib目录中删除不必要的库。LabVIEW会为每个选板图像使用一个 GDI 对象,因此具有大量选板 的VI 将导致此崩溃。
  • 如果您在 VI 中不断打开和关闭数据库,请通过收集更多要发送的数据来避免频繁打开/关闭数据库。
  • 重新启动您的 cRIO(或其他使用的硬件)可能会是一个临时的解决方案,但请按照上述详细步骤操作以防止问题再次出现。
  • 如果在调查上述选项后问题仍然存在,请致电 NI 支持寻求进一步地解决问题。

相关信息

GDI(图形设备接口)对象是负责表示图形对象的固定Windows资源。每个GDI对象都是、进程私有的,这意味着只有创建GDI对象的进程才能使用其对象句柄。

包括LabVIEW.exe在内的每个进程都被Windows限制为10,000个GDI对象,并且请求更多GDI对象会导致 LabVIEW 崩溃。此崩溃被NI错误报告工具 (NIER)捕获为 image.cppdrawmgr.cpp中的DAbort。要确认导致崩溃的原因是否是过度使用GDI,请使用Windows任务管理器查看LabVIEW使用了GDI的数量。对于Windows 10,默认情况下不显GDI数量。您需要转到任务管理器中的详细信息 --> 右键单击“名称”列»选择列”。

image.png