c++ - Stack Walking 一个被调试的进程

标签 c++ windows debugging callstack

我正在使用

打开一个进程(使用 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,而我知道堆栈中还有更多地址。

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

最佳答案

根据这个片段无法判断。您必须正确设置很多才能使其正常工作。在 this detailed blog post 查看逻辑.

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

关于c++ - Stack Walking 一个被调试的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4224307/

相关文章:

c++ - 严格的别名规则和 'char *' 指针

c++ - 使用 opencv 显示视频

c++ - 包含在主函数和类主体中会返回多个定义错误

windows - 哪种屏幕尺寸更适合最终用户

node.js - 来自 native 代码的 Mocha 测试中未处理的拒绝

debugging - GDB中调试过程中的asm代码从何而来?

r - 如果加载了 ggplot2 包,则在对象上调用 `str` 会出错

c++ - Windows 通用应用程序 (XAML) : textBlock->Text cannot be called with the given argument list

windows - 使用WMI检索当前的混音器电平?

windows - 什么语法将检查是否定义了包含空格的变量名?