void TDumpJob::DoSaving(TCmdTransceiver &Tr, TErrList *pErr) { if (!MemBuf.Empty()) { std::string sFileName=GetDumpFileName(bsi.oSerNum.Get(TBsSerNum()).Get()); std::ofstream fDump(sFileName.c_str(), std::ios::binary); MemBuf.Save(fDump); } MainState=msEnd; }
LONG CMiniDump::UnHandleExceptionFilterS(PEXCEPTION_POINTERS pExceptionInfo) { std::wstring strFileName; MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo; HANDLE hDumpFile = INVALID_HANDLE_VALUE; if (!GetDumpFileName(strFileName)) return EXCEPTION_EXECUTE_FAULT; // 写dump文件 hDumpFile = ::CreateFile(strFileName.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hDumpFile == INVALID_HANDLE_VALUE) return EXCEPTION_EXECUTE_FAULT; loExceptionInfo.ExceptionPointers = pExceptionInfo; loExceptionInfo.ThreadId = ::GetCurrentThreadId(); loExceptionInfo.ClientPointers = TRUE; MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL); CloseHandle(hDumpFile); return EXCEPTION_EXECUTE_HANDLER; }
void WriteMiniDumpFile(struct _EXCEPTION_POINTERS* ExceptionInfo) { if (ExceptionInfo == NULL) { return; } CString strDumpFilePath = GetDumpFileName(); if (strDumpFilePath.IsEmpty()) { return; } HANDLE hfile = CreateFile(strDumpFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hfile) { return; } MINIDUMP_EXCEPTION_INFORMATION dumpInfo = {0}; dumpInfo.ExceptionPointers = ExceptionInfo; dumpInfo.ClientPointers = TRUE; dumpInfo.ThreadId = GetCurrentThreadId(); MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hfile, MiniDumpWithFullMemory, &dumpInfo, NULL, NULL); if (hfile != INVALID_HANDLE_VALUE) { CloseHandle(hfile); } }
GLvoid CApiDumpDraw::DumpDepth(GLESAPIIndex func) { GLchar fileName[256] = {}; static GLboolean bFirst = GL_TRUE; if (bFirst) { m_apiEngine.CreateDumpDepthProgram(); bFirst = GL_FALSE; } if (m_apiEngine.DrawStatesIsBindFBO()) { if (!GetDumpFileName(fileName, "depth", m_nLoop, func)) { return; } } else { if (m_options.dumpDrawPng) { sprintf(fileName, "%s/DumpFrame%d_%d_depth_%s.png", API_DUMP_DRAW_PATH, m_nCurrentFrameNum, m_nLoop, GetAPIName(func)); } else { sprintf(fileName, "%s/DumpFrame%d_%d_depth_%s.bmp", API_DUMP_DRAW_PATH, m_nCurrentFrameNum, m_nLoop, GetAPIName(func)); } } GLfloat position[] = { -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 0.0f }; GLint width = m_apiEngine.DrawStatesViewportW(); GLint height = m_apiEngine.DrawStatesViewportH(); GLuint program = m_apiEngine.GetDumpDepthProgram(); GLenum texUnit = m_apiEngine.DrawStatesActiveTexUnit(); GLuint tex = 0; GLuint fbo = 0; GLuint fbo1 = 0; GLuint tex1 = 0; GLint locPos = -1; GLint locTex = -1; GLint locSampler = -1; GLuint drawFBO = m_apiEngine.DrawStatesFBO(); g_opengl->glGetError(); m_apiEngine.ActiveTexture(texUnit); // Create texture tex = m_apiEngine.GenTexture(GL_TEXTURE_2D); m_apiEngine.TexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, width, height, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL); m_apiEngine.TexParameters(GL_TEXTURE_2D, GL_NEAREST, GL_NEAREST, GL_REPEAT, GL_REPEAT, GL_REPEAT, GL_NONE); // Create FBO fbo = m_apiEngine.GenFramebuffer(GL_DRAW_FRAMEBUFFER); m_apiEngine.FramebufferTexture2D(GL_DRAW_FRAMEBUFFER, fbo, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, tex, 0); // Blit original color buffer to texture. m_apiEngine.BindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); m_apiEngine.BindFramebuffer(GL_READ_FRAMEBUFFER, drawFBO); m_apiEngine.BlitFramebuffer(width, height, GL_DEPTH_BUFFER_BIT, GL_NEAREST); // Create texture tex1 = m_apiEngine.GenTexture(GL_TEXTURE_2D); m_apiEngine.TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, GL_RGBA, GL_UNSIGNED_BYTE, NULL); m_apiEngine.TexParameters(GL_TEXTURE_2D, GL_NEAREST, GL_NEAREST, GL_REPEAT, GL_REPEAT, GL_REPEAT, GL_NONE); fbo1 = m_apiEngine.GenFramebuffer(GL_FRAMEBUFFER); m_apiEngine.FramebufferTexture2D(GL_FRAMEBUFFER, fbo1, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex1, 0); m_apiEngine.BindFramebuffer(GL_FRAMEBUFFER, fbo1); g_opengl->glClear(GL_COLOR_BUFFER_BIT); g_opengl->glDisable(GL_DEPTH_TEST); g_opengl->glDisable(GL_STENCIL_TEST); g_opengl->glDisable(GL_BLEND); m_apiEngine.UseDumpDepthProgram(); locPos = m_apiEngine.GetAttribLocation(program, "a_vertex"); locTex = m_apiEngine.GetAttribLocation(program, "a_texcoord"); locSampler = m_apiEngine.GetUniformLocation(program, "sShadow"); m_apiEngine.ActiveTexture(texUnit); m_apiEngine.BindTexture(GL_TEXTURE_2D, tex); g_opengl->glUniform1i(locSampler, texUnit-GL_TEXTURE0); g_opengl->glBindBuffer(GL_ARRAY_BUFFER, 0); g_opengl->glEnableVertexAttribArray(locPos); g_opengl->glVertexAttribPointer(locPos, 2, GL_FLOAT, 0, 16, &position[0]); if (locTex != -1) { g_opengl->glEnableVertexAttribArray(locTex); g_opengl->glVertexAttribPointer(locTex, 2, GL_FLOAT, 0, 16, &position[2]); } g_opengl->glDrawArrays(GL_TRIANGLES, 0, 6); if (m_options.dumpDrawPng) { DumpPng(fileName); } else { DumpBmp(fileName); } g_opengl->glDeleteTextures(1, &tex); g_opengl->glDeleteFramebuffers(1, &fbo); g_opengl->glDeleteTextures(1, &tex1); g_opengl->glDeleteFramebuffers(1, &fbo1); }
GLvoid CApiDumpDraw::DumpDraw(GLESAPIIndex func) { if (!m_options.dumpDraw) { return; } if ((m_options.dumpDrawStart && m_options.dumpDrawStart > m_nCurrentFrameNum) || (m_options.dumpDrawEnd && m_options.dumpDrawEnd < m_nCurrentFrameNum)) { return; } if (func != GL3_API_glDrawArrays && func != GL3_API_glDrawElements && func != GL3_API_glClear && func != GL3_API_glDrawArraysInstanced && func != GL3_API_glDrawElementsInstanced && func != GL3_API_glDrawRangeElements && func != GL3_API_glMultiDrawArraysEXT && func != GL3_API_glMultiDrawElementsEXT) { return; } // Dump depth buffer if (m_options.dumpDepth && g_opengl->glIsEnabled(GL_DEPTH_TEST)) { m_apiEngine.SaveDrawStates(); DumpDepth(func); m_apiEngine.LoadDrawStates(); } else { m_apiEngine.SaveDrawStates(); } GLchar fileName[256] = {}; if (m_apiEngine.DrawStatesIsBindFBO()) { if (!GetDumpFileName(fileName, "color", m_nLoop, func)) return; } else { if (m_options.dumpDrawPng) { sprintf(fileName, "%s/DumpFrame%d_%d_color_%s.png", API_DUMP_DRAW_PATH, m_nCurrentFrameNum, m_nLoop, GetAPIName(func)); } else { sprintf(fileName, "%s/DumpFrame%d_%d_color_%s.bmp", API_DUMP_DRAW_PATH, m_nCurrentFrameNum, m_nLoop, GetAPIName(func)); } } if (m_options.dumpDrawPng) { DumpPng(fileName); } else { DumpBmp(fileName); } m_nLoop ++; }