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( .... )
}