【问题标题】:Why does my program consume 100% CPU under nVidia NView?为什么我的程序在 nVidia NView 下会消耗 100% CPU?
【发布时间】:2023-05-07 00:23:01
【问题描述】:

我最近正在开发一个 Windows 程序,当在生产环境中滚动浏览大量项目时,该程序有时会变得无响应。当然,它在我的桌面上运行良好。生产环境是:

  • 基于 Windows XP 的工作站,带 2 台显示器
  • 启用 nView 的 nVidia 视频驱动程序

值得注意的是进程终止时生成的 Dr watson 堆栈跟踪:

线程 ID 0xef4 的状态转储 eax=00e3fff8 ebx=000000a0 ecx=00e00000 edx=00000000 esi=0003fff8 edi=00e40000 eip=00b920c2 esp=0012bcac ebp=00000000 iopl=0 nv up ei ng nz na pe cy cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000283 \system32\nview.dll - 功能:nview!NVLoadDatabase 00b920a8 c80b0600 输入 0x60b,0x0 00b920ac 83c30f 添加 ebx,0xf 00b920af 33f6 xor esi,esi 00b920b1 03f9 添加 edi,ecx 00b920b3 83e3f8 和 ebx,0xfffffff8 00b920b6 3bcf cmp ecx,edi 00b920b8 89742414 mov [esp+0x14],esi 00b920bc 734c jnb nview!NVLoadDatabase+0xcaf (00b9210a) 00b920be 8bc1 移动 eax,ecx 00b920c0 8b10 移动 edx,[eax] 00b920c2 8b4004 移动 eax,[eax+0x4] ds:0023:00e3fffc=00000000 00b920c5 89442414 mov [esp+0x14],eax 00b920c9 8bc2 移动 eax,edx 00b920cb 2500000001 和 eax,0x1000000 00b920d0 33ed xor ebp,ebp 00b920d2 0bc5 或 eax,ebp 00b920d4 7414 jz nview!NVLoadDatabase+0xc8f (00b920ea) 00b920d6 8bc2 移动 eax,edx 00b920d8 c1e008 shl eax,0x8 00b920db 8be8 移动 ebp,eax 00b920dd c1f81f sar eax,0x1f ChildEBP RetAddr Args to Child 00000000 00000000 00000000 00000000 00000000 nview!NVLoadDatabase+0xc67

为什么这个问题只出现在生产环境中?

【问题讨论】:

    标签: c++ windows nvidia


    【解决方案1】:

    这很有趣,因为 nView 是 NVidia 提供的第 3 方 DLL。互联网上关于nview!NVLoadDatabase 的帖子表明nview 中存在未修补的缺陷。正如这些报告所证实的,资源管理器使用 100% CPU 的事实支持了这一点。见:http://forums.nvidia.com/lofiversion/index.php?t36879.html

    此网站上提供了对此问题的详细调查: http://blogs.technet.com/marcelofartura/archive/2007/02/28/real-case-random-apps-running-100-cpu.aspx

    根据本文,挂起是由于 nview.dll 中的无限循环。尽管在线描述的汇编指令和寄存器值与我们的日志中的不完全匹配,但它们足够接近,我可以得出结论,这是同一个问题。

    为了解决这个问题,我禁用了 nView 桌面管理器(右键单击桌面,选择 nView 属性,然后在 nView 桌面管理器组合框中单击禁用)。在这样做之前,我能够始终如一地重现挂起。但是,禁用 nView 后,我无法重现挂起。因此,这似乎是一种可行的解决方法。

    不管怎样,我把这个贴在这里,以防它对任何人有用。追着这个让我很伤心。

    【讨论】: