Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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);
    }
}
Пример #4
0
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);
}
Пример #5
0
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 ++;
}