你好,祝你有美好的一天。
这里需要一点帮助:
情况:
我有一个晦涩的 DirectX 9 应用程序(名称和应用程序详细信息与问题无关),自某些驱动程序版本以来,它会导致所有 nvidia 卡(GeForce 8400GS 及更高版本)出现蓝屏死机。我认为该问题是由 DirectX 9 调用或触发驱动程序错误的标志间接引起的。
目标:
我想追踪有问题的标志/函数调用(为了好玩,这不是我的工作/家庭作业)并通过编写代理 dll 绕过错误条件。我已经有一个完成的代理 dll,它为 IDirect3D9、IDirect3DDevice9、IDirect3DVertexBuffer9 和 IDirect3DIndexBuffer9 提供包装器,并提供 Direct3D 调用的基本日志记录/跟踪。但是,我无法确定导致崩溃的功能。
问题:
- 没有可用的源代码或技术支持。不会有任何帮助,也没有其他人可以解决问题。
- 内核产生的内存转储没有帮助 - 显然在 nv4_disp.dll 中发生了访问冲突,但我不能使用堆栈跟踪去 IDirect3DDevice9 方法调用,另外还有可能异步发生错误。
- (主要问题)由于大量 Direct3D9Device 方法调用,我无法可靠地将它们记录到文件中或通过网络:
- 即使没有刷新,登录到文件也会导致显着减慢,因此,当系统蓝屏死机时,日志的所有最后内容都会丢失。
- 通过网络登录(使用 UDP 和 WINSOck 的
sendto
)也会导致显着减速,并且不能异步完成(异步数据包在 BSOD 上丢失),加上数据包(崩溃周围的数据包)有时即使在同步发送时也会丢失。 - 当应用程序通过记录例程“减慢”速度时,BSOD 不太可能发生,这使得跟踪它变得更加困难。
问题:
我通常不编写驱动程序,也不进行这种级别的调试,所以我觉得我遗漏了一些重要的东西,有一种比使用自定义日志记录机制编写 IDirect3DDevice9 代理 dll 更简单的方法来追踪问题. 它是什么?诊断/处理/修复此类问题的标准方法是什么(没有源代码,COM接口方法触发BSOD)?
小型转储分析(WinDBG):
加载用户符号 加载卸载的模块列表 ............ 无法加载图像 nv4_disp.dll,Win32 错误 0n2 *** 警告:无法验证 nv4_disp.dll 的时间戳 *** 错误:模块加载完成,但无法为 nv4_disp.dll 加载符号 ****************************************************** ***************************** * * *错误检查分析* * * ****************************************************** ***************************** 使用 !analyze -v 获取详细的调试信息。 错误检查 1000008E,{c0000005,bd0a2fd0,b0562b40,0} 可能是由于:nv4_disp.dll (nv4_disp+90fd0) 跟进:MachineOwner --------- 0: kd>!分析-v ****************************************************** ***************************** * * *错误检查分析* * * ****************************************************** ***************************** KERNEL_MODE_EXCEPTION_NOT_HANDLED_M (1000008e) 这是一个非常常见的错误检查。通常异常地址会查明 导致问题的驱动程序/功能。总是记下这个地址 以及包含此地址的驱动程序/图像的链接日期。 一些常见问题是异常代码 0x80000003。这意味着一个硬 编码断点或断言被命中,但该系统已启动 /节点调试。这不应该发生,因为开发人员不应该有 零售代码中的硬编码断点,但是... 如果发生这种情况,请确保已连接调试器,并且 系统已启动 /DEBUG。这将让我们看看为什么这个断点是 正在发生。 论据: Arg1: c0000005, 未处理的异常代码 Arg2: bd0a2fd0, 异常发生的地址 Arg3:b0562b40,陷阱帧 Arg4: 00000000 调试细节: ------------------ EXCEPTION_CODE:(NTSTATUS)0xc0000005 - “0x%08lx”处的指令引用了“0x%08lx”处的内存。内存不能是“%s”。 FAULTING_IP: nv4_disp+90fd0 bd0a2fd0 39b8f8000000 cmp dword ptr [eax+0F8h],edi TRAP_FRAME: b0562b40 -- (.trap 0xffffffffb0562b40) 错误代码 = 00000000 eax=00000808 ebx=e37f8200 ecx=e4ae1c68 edx=e37f8328 esi=e37f8400 edi=00000000 eip=bd0a2fd0 esp=b0562bb4 ebp=e37e09c0 iopl=0 nv up ei pl nz na po nc cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010202 nv4_disp+0x90fd0: bd0a2fd0 39b8f8000000 cmp dword ptr [eax+0F8h],edi ds:0023:00000900=???????? 重置默认范围 CUSTOMER_CRASH_COUNT: 3 DEFAULT_BUCKET_ID:DRIVER_FAULT BUGCHECK_STR:0x8E LAST_CONTROL_TRANSFER:从 bd0a2e33 到 bd0a2fd0 堆栈文本: 警告:堆栈展开信息不可用。以下框架可能是错误的。 b0562bc4 bd0a2e33 e37f8200 e37f8200 e4ae1c68 nv4_disp+0x90fd0 b0562c3c bf8edd6b b0562cfc e2601714 e4ae1c58 nv4_disp+0x90e33 b0562c74 bd009530 b0562cfc bf8ede06 e2601714 win32k!WatchdogDdDestroySurface+0x38 b0562d30 bd00b3a4 e2601008 e4ae1c58 b0562d50 dxg!vDdDisableSurfaceObject+0x294 b0562d54 8054161c e2601008 00000001 0012c518 dxg!DxDdDestroySurface+0x42 b0562d54 7c90e4f4 e2601008 00000001 0012c518 nt!KiFastCallEntry+0xfc 0012c518 00000000 00000000 00000000 00000000 0x7c90e4f4 堆栈命令:kb FOLLOWUP_IP: nv4_disp+90fd0 bd0a2fd0 39b8f8000000 cmp dword ptr [eax+0F8h],edi SYMBOL_STACK_INDEX:0 SYMBOL_NAME:nv4_disp+90fd0 FOLLOWUP_NAME:机器所有者 模块名称:nv4_disp IMAGE_NAME:nv4_disp.dll DEBUG_FLR_IMAGE_TIMESTAMP:4e390d56 FAILURE_BUCKET_ID:0x8E_nv4_disp+90fd0 BUCKET_ID:0x8E_nv4_disp+90fd0 跟进:MachineOwner