- cplusplus/
- C++ 为什么我的程序在nVidia NView下消耗100%的CPU?
C++ 为什么我的程序在nVidia NView下消耗100%的CPU?
C++ 为什么我的程序在nVidia NView下消耗100%的CPU?,c++,windows,nvidia,C++,Windows,Nvidia,我最近正在开发一个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=0
我最近正在开发一个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
线程Id 0xef4的状态转储
eax=00e3fff8 ebx=000000 A0 ecx=00e00000 edx=00000000 esi=0003fff8 edi=00e40000
eip=00b920c2 esp=0012bcac ebp=00000000 iopl=0 nv向上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异或esi,esi
00b920b1 03f9添加edi、ecx
00b920b3 83e3f8和ebx,0xfffffff8
00b920b6 3bcf cmp ecx,电子数据交换
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和eax,0x1000000
00b920d0 33ed异或ebp,ebp
00b920d2 0bc5或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将参数重新寻址到Child
00000000000000000000000000000000000000000000000000000000 nview!NVLoadDatabase+0xc67
为什么这个问题只发生在生产中?这很有趣,因为nView是NVidia提供的第三方DLL。在互联网上发布关于nview!NVLoadDatabase
表明NVView中存在未修补的缺陷。正如这些报告所证实的,explorer使用100%的CPU这一事实支持了这一点。见:
有关此问题的详细调查,请访问此网站:
根据本文,挂起是由于nview.dll中的无限循环造成的。虽然在线描述的汇编指令和寄存器值与我们日志中的不完全匹配,但它们非常接近,因此我得出结论,这是同一个问题
为了解决这个问题,我禁用了nView桌面管理器(右键单击桌面,选择nView属性,然后在nView桌面管理器组框中单击禁用)。在此之前,我能够始终如一地重现挂起。然而,禁用nView后,我无法重现挂起。因此,这似乎是一个可行的解决办法
无论如何,我把这个贴在这里,以防对任何人都有用。追查这件事让我很伤心