2014-07-17 102 views
0

我想使用IDebugXXX interfaces獲取我的local process(沒有遠程附加)中的某些功能的堆棧跟蹤。Stacktrace/Stackwalk爲當前進程和當前線程與IDebug接口

使用此代碼附加到當前進程的作品,但當前線程的堆棧跟蹤送花兒給人包含only one frame,如: 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而其他線程的結果至少包含更多的幀。

+0

託管調試器無法獲取非託管代碼的堆棧跟蹤。 –

+0

這是一個C++/CLI應用程序 – boboes

+0

然後,使這個複雜沒有意義,只需使用StackTrace類。 –

回答

1

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

這很適合我:(注意:請檢查這些API的返回碼)

我認爲你缺少的是:「AttachProcess」後「WaitForEvent」電話。

IDebugClient4 * debugClient; 
IDebugControl4 * control4; 
DEBUG_STACK_FRAME frames[10]; 
ULONG filled = 0; 
ULONG pid = 7288; 

DebugCreate(__uuidof(IDebugClient4), (void **)&debugClient); 

debugClient->QueryInterface(__uuidof(IDebugControl4), (void**)&control4); 

debugClient->AttachProcess(0, pid, DEBUG_ATTACH_NONINVASIVE | DEBUG_ATTACH_NONINVASIVE_NO_SUSPEND); 

control4->WaitForEvent(DEBUG_WAIT_DEFAULT, INFINITE); 

control4->GetStackTrace(0, 0, 0, &frames[0], 10, &filled); 
+0

謝謝,我可以在星期一進行測試,並讓它知道它是如何工作的 – boboes

+0

相同的行爲,只有一個幀被填充 – boboes

+1

終於明白了,上下文也丟失了 – boboes