【问题标题】:Stack Walking a debugged process堆栈遍历已调试的进程
【发布时间】:2011-05-12 13:52:54
【问题描述】:

我正在使用

打开一个进程(使用 C++/Windows)
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;  

然后我试图用堆栈遍历它

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

但是stackwalk只给了我顶部地址,下一个是0,而我知道堆栈中有更多地址。

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

【问题讨论】:

    标签: c++ windows debugging callstack


    【解决方案1】:

    哎呀...我忘记在从调试进程接收事件后调用“ContinueDebugEvent” - 所以它一直处于暂停状态并且 StackWalk 实际上是正确的。 :)

    【讨论】:

      【解决方案2】:

      根据这个sn-p无法判断。您必须正确设置很多内容才能使其正常工作。查看this detailed blog post的逻辑。

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

      【讨论】:

      • 当我只使用“CREATE_NEW_CONSOLE”标志创建进程时,我已经很好地完成了这个工作,但现在我需要堆叠一个调试过的进程。 “CreateProcess”中的标志是我所做的唯一区别......
      猜你喜欢
      • 2016-08-13
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多