代码之家  ›  专栏  ›  技术社区  ›  dom_beau

调试时使用MinidumpWriteUp()Win32 API时出现异常

  •  0
  • dom_beau  · 技术社区  · 6 年前

    我从C++/CLI中的进程“1”派生出一个进程“2”。当两个进程都在运行时,进程“1”会终止进程“2”(按设计)。我的目标是在杀死“2”之前制作一个小型垃圾场。

    这是我的代码:

    // mpProcess started with System::Diagnostics::Process... etc.
    System::IO::FileStream^ fs = gcnew System::IO::FileStream("MyPath.dmp");
    
    MiniDumpWriteDump( mpProcess->Handle.ToPointer(), mpProcess->Id, fs->SafeFileHandle->DangerousGetHandle().ToPointer(), MINIDUMP_TYPE::MiniDumpNormal, nullptr, nullptr, nullptr);
    fs->Close();
    

    当我从命令行启动进程“1”,而不将其附加到调试器时,它会正常运行,启动进程“2”,然后转储它,然后终止它。

    当我在调试器中启动进程“1”时,我得到2-3 AccessViolationException 当我跨过电话 MiniDumpWriteDump ,但如果我单击“继续”,一切都会正常,并生成转储文件。

    怎么回事?我的设计有什么问题吗?请注意,这是我第一次使用这个API,24小时前我甚至不知道我可以转储这样的文件;-)!我将非常感谢您的帮助,以提高我的技能与转储文件。

    编辑1 添加了异常信息:

    以下是我得到的信息:

    在MYProg中的0x000007FED860FD31(mscordacwks.dll)处引发异常。exe:0xC0000005:访问冲突读取位置0x0000000000。

    如果有此异常的处理程序,程序可以安全地继续。

    编辑2 添加了一个代码片段和堆栈跟踪

    过程1 :杀手

    // Process1.cpp : main project file.
    
    #include "stdafx.h"
    
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <dbghelp.h>
    
    using namespace System;
    
    int main(array<System::String ^> ^args)
    {
         Console::WriteLine(L"Hello, I'm Process1! I'll \"minidump\" Process2 then kill it!");
    
        System::Diagnostics::Process^ p = gcnew System::Diagnostics::Process();
    
        p->StartInfo->FileName = "Process2.exe";
        p->Start();
    
        System::Threading::Thread::Sleep( 3000 );
    
        System::IO::FileStream^ fs = gcnew System::IO::FileStream( "minidump.dmp", System::IO::FileMode::Create );
    
        MiniDumpWriteDump( p->Handle.ToPointer(), p->Id, fs->SafeFileHandle->DangerousGetHandle().ToPointer(), MINIDUMP_TYPE::MiniDumpNormal, nullptr, nullptr, nullptr );
    
        fs->Close();
    
        p->Kill();
    
        return 0;
    }
    

    过程2 字体“被抛弃”

    // Process2.cpp : main project file.
    
    #include "stdafx.h"
    
    using namespace System;
    
    int main(array<System::String ^> ^args)
    {
        Console::WriteLine(L"Hello, I'm Process2! I'm waiting to be killed by Process1!");
    
        // Do nothing, wait to be killed
        while ( true )
        {
            System::Threading::Thread::Sleep( 1000 );
        }
    
        return 0;
    }
    

    堆栈跟踪 当我把它从内部打破( 访问违规 )异常对话框:

    mscordacwks.dll!000007fed860fd31()  Unknown
    mscordacwks.dll!000007fed861028c()  Unknown
    mscordacwks.dll!000007fed8610fd2()  Unknown
    mscordacwks.dll!000007fed861165f()  Unknown
    mscordacwks.dll!000007fed861176e()  Unknown
    dbghelp.dll!GenGetAuxMemory(struct _MINIDUMP_STATE *,struct _INTERNAL_PROCESS *)    Unknown
    dbghelp.dll!GenGetProcessInfo(struct _MINIDUMP_STATE *,struct _INTERNAL_PROCESS * *)    Unknown
    dbghelp.dll!MiniDumpProvideDump()   Unknown
    dbghelp.dll!MiniDumpWriteDump() Unknown
    [Managed to Native Transition]  
    [CURSOR]>>> Process1.exe!main(array<System::String^>^ args=array<System::String^>(0)) Line 24   C++
    Process1.exe!mainCRTStartupStrArray(array<System::String^>^ arguments=array<System::String^>(0)) Line 249   C++
    [Native to Managed Transition]  
    mscoreei.dll!000007feee467a6d() Unknown
    mscoree.dll!_CorExeMain_Exported()  Unknown
    kernel32.dll!BaseThreadInitThunk()  Unknown
    ntdll.dll!RtlUserThreadStart()  Unknown
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   Menace    4 年前

    就像上面评论中提到的汉斯·帕桑(Hans Passant)一样,这似乎是一个内部/捕获的例外。MiniTumpWriteMap执行导致异常的操作,并捕获其内部异常并继续。我真的不知道为什么会这样。你可以忽略它继续。这似乎无害。

    我在调用其他(不透明的)系统API调用时也遇到过类似的问题。调用本身在内部捕获自己的异常。调试器不知道它们是否会被抓到,于是就打断了它们。

    它们不应该在发布模式下出现。

    推荐文章