2010-11-19 65 views
6

我开开过程中使用堆栈遍历调试的进程

if(CreateProcessA(NULL, // No module name (use command line) 
    (LPSTR)path, //argv[1],  // Command line 
    NULL,   // Process handle not inheritable 
    NULL,   // Thread handle not inheritable 
    FALSE,   // Set handle inheritance to FALSE 
    creationFlags,    // No creation flags 
    NULL,   // Use parent's environment block 
    NULL,   // Use parent's starting directory 
    &startInfo,   // Pointer to STARTUPINFO structure 
    &processInfo)   // Pointer to PROCESS_INFORMATION structure 

其中

DWORD creationFlags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS; 

,然后(用C++/Windows)中,我试图用

到stackwalk它
bool ok = StackWalk64(IMAGE_FILE_MACHINE_I386,m_ps.Handle ,m_th.Handle, 
    &m_stackframe, &m_threadContext, 
    0, NULL, NULL, 0); 

但stackwalk只是给我的顶端地址和下一个是0,而我知道 ther e是堆栈中的更多地址。

有人知道问题出在哪里吗?
谢谢:)

回答

0

oops ...我从调试过程中接收事件后忘记调用“ContinueDebugEvent” - 所以它保持暂停状态,StackWalk事实上是正确的。 :)

0

根据这段代码无法判断。有这么多你必须正确设置才能使其工作。查看this detailed blog post的逻辑。

发布更多的代码,如果你可以张贴更大但不是太大的样本。你如何设置STACKFRAME和CONTEXT结构?你在StackWalk64上循环?任何给定的调用只返回一个堆栈帧。

+0

当我仅用“CREATE_NEW_CONSOLE”标志创建进程时,我已经有了这个工作,但现在我需要stackwalk一个调试过程。 “CreateProcess”中的标志是我所做的唯一区别... – Idov 2010-11-19 14:58:14