2016-05-10 87 views
0

這個問題類似於:Intermittent Access Violation ID2D1RenderTarget::EndDraw但我已經完成了在該問題中提出的所有建議,但仍然沒有解決方案的位置。d2d1debug3.dll!DebugRenderTarget :: EndDraw訪問衝突

運行1D2DRenderTarget :: EndDraw時,我的應用程序(Windows應用商店應用程序)有時會拋出內存訪問衝突異常(通常在大量使用幾分鐘後,並且僅在Win10設備中)。根據轉儲文件,它說:「線程試圖讀取或寫入虛擬地址,它沒有適當的訪問。」

有很少的變種,但它在進行EndDraw調用時發生訪問衝突。下面是反彙編和調用堆棧:

d3d10warp.dll!UMDevice::DestroyResource(struct D3D10DDI_HDEVICE,struct D3D10DDI_HRESOURCE) Unknown 
d3d11.dll!NDXGI::CDeviceChild<IDXGIResource1,IDXGISwapChainInternal>::FinalRelease() Unknown 
d3d11.dll!CUseCountedObject<NOutermost::CDeviceChild>::UCDestroy() Unknown 
d3d11.dll!CUseCountedObject<NOutermost::CDeviceChild>::UCReleaseUse() Unknown 
d3d11.dll!NDXGI::CDeviceChild<IDXGISurface,IUnknown>::FinalRelease() Unknown 
d3d11.dll!CUseCountedObject<NOutermost::CDeviceChild>::UCDestroy() Unknown 
d3d11.dll!CDevCtxInterface::CDevCtxInterface<CContext>() Unknown 
d3d11.dll!CContext::TID3D11DeviceContext_SetShaderResources_Amortized<0,4>() Unknown 
d2d1.dll!CD3DDeviceLevel1::ProcessDeferredOperations() Unknown 
d2d1.dll!CHwSurfaceRenderTarget::FlushQueuedOperations() Unknown 
d2d1.dll!CHwSurfaceRenderTarget::EndProcessBatch() Unknown 
d2d1.dll!CHwSurfaceRenderTarget::ProcessBatch() Unknown 
d2d1.dll!CBatchSerializer::FlushInternal() Unknown 
d2d1.dll!CBatchSerializer::Flush() Unknown 
d2d1.dll!DrawingContext::FlushBatch() Unknown 
d2d1.dll!DrawingContext::EndDraw() Unknown 
d2d1.dll!D2DDeviceContextBase<ID2D1RenderTarget,ID2D1DeviceContext3,ID2D1DeviceContext3>::EndDraw() Unknown 
d2d1debug3.dll!DebugRenderTarget::EndDraw(class DebugLayer &,struct ID2D1RenderTarget *,unsigned __int64 *,unsigned __int64 *) Unknown 
d2d1debug3.dll!DebugRenderTargetGenerated<struct ID2D1BitmapRenderTarget>::EndDraw(unsigned __int64 *,unsigned __int64 *) Unknown 
OZDebugApp_wrt_2013.exe!OZXCanvasD2D::~OZXCanvasD2D() Line 203 C++ 

拆卸:

679F0EC1 mov   eax,dword ptr [ebx+4] 
679F0EC4 mov   dword ptr [ecx+4],eax 
679F0EC7 jmp   UMDevice::DestroyResource+1CAh (679F0E6Ah) 
679F0EC9 mov   eax,dword ptr [edi+220h] 
679F0ECF mov   eax,dword ptr [eax+3Ch] 
679F0ED2 test  eax,eax 
679F0ED4 je   UMDevice::DestroyResource+135h (679F0DD5h) 
679F0EDA cmp   eax,0FFBADBADh 
679F0EDF je   UMDevice::DestroyResource+135h (679F0DD5h) 
679F0EE5 mov   cl,byte ptr ds:[67B58280h] 
>> 679F0EEB movzx  eax,byte ptr [eax] 
679F0EEE add   ecx,eax 
679F0EF0 mov   byte ptr ds:[67B58280h],cl 
679F0EF6 jmp   UMDevice::DestroyResource+135h (679F0DD5h) 
679F0EFB push  1 

這是另一種變體

msvcrt.dll!__VEC_memcpy() Unknown 
msvcrt.dll!__VEC_memcpy() Unknown 
d2d1.dll!DrawingContext::EndDraw() Unknown 
D2D1Debug3.dll!DebugRenderTarget::EndDraw(class DebugLayer &,struct ID2D1RenderTarget *,unsigned __int64 *,unsigned __int64 *) Unknown 
D2D1Debug3.dll!DebugRenderTargetGenerated<struct ID2D1BitmapRenderTarget>::EndDraw(unsigned __int64 *,unsigned __int64 *) Unknown 
OZDebugApp_wrt_2013.exe!OZXCanvasD2D::~OZXCanvasD2D() Line 203 C++ 

拆卸:

76C7A3A7 mov   dword ptr [ebp-8],esi 
76C7A3AA mov   esi,dword ptr [ebp+0Ch] 
76C7A3AD mov   edi,dword ptr [ebp+8] 
76C7A3B0 mov   ecx,dword ptr [ebp+10h] 
76C7A3B3 shr   ecx,7 
76C7A3B6 jmp   __VEC_memcpy+108h (76C7A3BEh) 
76C7A3B8 lea   ebx,[ebx] 
>> 76C7A3BE movdqa  xmm0,xmmword ptr [esi] 
76C7A3C2 movdqa  xmm1,xmmword ptr [esi+10h] 
76C7A3C7 movdqa  xmm2,xmmword ptr [esi+20h] 
76C7A3CC movdqa  xmm3,xmmword ptr [esi+30h] 
76C7A3D1 movdqa  xmmword ptr [edi],xmm0 
76C7A3D5 movdqa  xmmword ptr [edi+10h],xmm1 
76C7A3DA movdqa  xmmword ptr [edi+20h],xmm2 
76C7A3DF movdqa  xmmword ptr [edi+30h],xmm3 

事情我已經嘗試:

  1. 我檢查了多線程。我的應用程序使用一個具有多線程屬性和多個渲染目標的1D2D工廠,因此默認情況下圖形應該交錯。最重要的是,我嘗試添加鎖,以便每個BeginDraw,EndDraw,渲染目標創建和DXGI相關的東西都處於關鍵部分。
  2. Ran啓用了調試層,都帶有DirectX控制面板和代碼。
  3. 生成崩潰轉儲文件,但使用它似乎只是調試遠程機器完全相同?
  4. 實現了一個記錄器來爲每個渲染目標生成合成/繪圖調用和參數。每次運行產生大約40mb的日誌。我檢查了墜毀的渲染目標,他們的圖紙與之前的一些圖紙完全相同,ie)我真的不知道在繪圖級別發生了什麼問題。

以上都沒有工作,我非常感謝任何幫助。

回答

0

事實證明,我沒有爲CreateWicBitmapRenderTarget的一個實例設置關鍵部分。在多線程屬性中運行D2Dfactory會交叉所有Direct2D調用,但它不適用於WIC,DXGI或其他D3D調用。我不得不使用:

Microsoft::WRL::ComPtr<ID2D1Multithread> d2DMultithread; 
     d2dFactory.As(&d2DMultithread); 
     d2DMultithread->Enter(); 
     HRESULT targetCreationResult = d2dFactory->CreateWicBitmapRenderTarget(m_wicBitmap.Get(), &prop, &target); 
     d2DMultithread->Leave(); 

完成其他渲染目標創建和Begin/EndDraw相同。我通過查看調試中的線程視圖來注意到上述情況。