代码之家  ›  专栏  ›  技术社区  ›  Justin Ethier

为什么我的程序在NVIDIA NVIEW下消耗100%的CPU?

  •  0
  • Justin Ethier  · 技术社区  · 15 年前

    我最近正在开发一个Windows程序,当在生产环境中滚动一个大的项目列表时,这个程序有时会失去响应。当然,它在我的桌面上可以正常工作。生产环境是:

    • 基于Windows XP的工作站,带2个监视器
    • 启用NVIEW的NVIDIA视频驱动程序

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

    State Dump for Thread 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 - 
    function: nview!NVLoadDatabase
            00b920a8 c80b0600         enter   0x60b,0x0
            00b920ac 83c30f           add     ebx,0xf
            00b920af 33f6             xor     esi,esi
            00b920b1 03f9             add     edi,ecx
            00b920b3 83e3f8           and     ebx,0xfffffff8
            00b920b6 3bcf             cmp     ecx,edi
            00b920b8 89742414         mov     [esp+0x14],esi
            00b920bc 734c             jnb     nview!NVLoadDatabase+0xcaf (00b9210a)
            00b920be 8bc1             mov     eax,ecx
            00b920c0 8b10             mov     edx,[eax]
            00b920c2 8b4004           mov     eax,[eax+0x4]     ds:0023:00e3fffc=00000000
            00b920c5 89442414         mov     [esp+0x14],eax
            00b920c9 8bc2             mov     eax,edx
            00b920cb 2500000001       and     eax,0x1000000
            00b920d0 33ed             xor     ebp,ebp
            00b920d2 0bc5             or      eax,ebp
            00b920d4 7414             jz      nview!NVLoadDatabase+0xc8f (00b920ea)
            00b920d6 8bc2             mov     eax,edx
            00b920d8 c1e008           shl     eax,0x8
            00b920db 8be8             mov     ebp,eax
            00b920dd c1f81f           sar     eax,0x1f
    
    ChildEBP RetAddr  Args to Child              
    00000000 00000000 00000000 00000000 00000000 nview!NVLoadDatabase+0xc67
    

    为什么这个问题只发生在生产中?

    1 回复  |  直到 13 年前
        1
  •  8
  •   Justin Ethier    13 年前

    这很有趣,因为NVIEW是NVIDIA提供的第三方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后,我无法复制挂起。因此,这似乎是一个可行的解决方案。

    不管怎样,我把这个贴在这里,以防对任何人有用。这件事让我很难过。