Windows 当前进程和具有IDebug接口的当前线程的Stacktrace/Stackwalk

Windows 当前进程和具有IDebug接口的当前线程的Stacktrace/Stackwalk,windows,debugging,c++-cli,stack-trace,Windows,Debugging,C++ Cli,Stack Trace,我想使用IDebugXXX接口获取我的本地进程中某些函数的堆栈跟踪(无远程连接) 使用此代码,附加到当前进程可以工作,但当前线程的堆栈跟踪始终只包含一个帧,如: ntdll!ZwGetContextThread+0x00000012 { IDebugClient* debugClient; IDebugControl4 *control4; ... int flags = DEBUG_ATTACH_NONINVASIVE | DEBUG_ATTACH_NONI

我想使用
IDebugXXX接口
获取我的
本地进程
中某些函数的堆栈跟踪(无远程连接)

使用此代码,附加到当前进程可以工作,但当前线程的堆栈跟踪始终只包含一个帧,如:
ntdll!ZwGetContextThread+0x00000012

{
    IDebugClient* debugClient;
    IDebugControl4 *control4;

    ...

    int flags = DEBUG_ATTACH_NONINVASIVE | DEBUG_ATTACH_NONINVASIVE_NO_SUSPEND;
    debugClient->AttachProcess(0, myProcessId, flags);

    control4->SetExecutionStatus(DEBUG_STATUS_GO);


    ...

    // get the stack trace for the current thread
    control4->GetStackTrace(0, 0, 0, _stackFrames, ARRAYSIZE((_stackFrames)), &_uFramesFilled)

    // _uFramesFilled is always '1' for the current thread
}
编辑: 应用程序是用C++/CLI编写的,其他线程的结果至少包含更多的帧。

这对我来说很好:(注意:请检查这些API的返回代码)

我认为您缺少的是“AttachProcess”之后的“WaitForEvent”呼叫


在阅读
WinDDK
中的
assert
示例后,我发现缺少堆栈跟踪必须从中开始的上下文。之后(并添加
WaitForEvent(…)
)跟踪工作正常

{
    ...

    // capture the context end convert it to debug '.crx' command
    char CxrCommand[64];
    CONTEXT myContext;
    ZeroMemory(&myContext, sizeof(CONTEXT));
    RtlCaptureContext(&myContext);
    sprintf_s(CxrCommand, 64, ".cxr 0x%p", &myContext);
    // capture the context end

    ...

    control4->WaitForEvent(DEBUG_WAIT_DEFAULT, INFINITE);

    //execute debugger command: ".cxr (Display Context Record)"
    control4->Execute(DEBUG_OUTCTL_IGNORE, CxrCommand, DEBUG_EXECUTE_NOT_LOGGED

    control4->GetStackTrace( .... )
}

托管调试器无法获取非托管代码的堆栈跟踪。它是一个C++/CLI应用程序。如果没有必要将其复杂化,请使用StackTrace类。我需要一个混合模式StackTrace,IDebug似乎是适合我的方法。最后,我需要一个像gethestackhere()这样的函数,我可以将它放在代码的任何地方。也许你在任何地方都知道一个样本?谢谢,我可以在周一测试它,并让大家知道它是如何工作的。同样的行为,只有一个框架被填充。最终得到了它,上下文也丢失了
{
    ...

    // capture the context end convert it to debug '.crx' command
    char CxrCommand[64];
    CONTEXT myContext;
    ZeroMemory(&myContext, sizeof(CONTEXT));
    RtlCaptureContext(&myContext);
    sprintf_s(CxrCommand, 64, ".cxr 0x%p", &myContext);
    // capture the context end

    ...

    control4->WaitForEvent(DEBUG_WAIT_DEFAULT, INFINITE);

    //execute debugger command: ".cxr (Display Context Record)"
    control4->Execute(DEBUG_OUTCTL_IGNORE, CxrCommand, DEBUG_EXECUTE_NOT_LOGGED

    control4->GetStackTrace( .... )
}