如何无创地附加到已经运行的进程

时间:2009-06-04 11:18:26

标签: windows debugging windbg

我在visual studio调试器下的断点处暂停了一个进程。 我可以在非侵入模式下附加cdb(微软的控制台调试器)和

一样多
cdb -p pid -pvr

如何使用我自己的使用Debug Engine API的程序实现相同的功能。

 IDebugClient* debugClient = 0;
(DebugCreate( __uuidof(IDebugClient), (void **)&debugClient );
 debugClient->AttachProcess(0,id,DEBUG_ATTACH_NONINVASIVE
                |DEBUG_ATTACH_NONINVASIVE_NO_SUSPEND);

此代码导致E_INVALIDARG。这种组合是不允许的?下面的一个工作,但当它调用GetStackTrace时,它返回E_UNEXPECTED。

debugClient->AttachProcess(0,id,DEBUG_ATTACH_NONINVASIVE);
debugControl->GetStackTrace(0, 0, 0, pStackFrames, maxFrames, &framesFilled);

我有兴趣以非侵入方式附加到调试中断的进程,并从其当前堆栈中获取一些局部变量&一些全局变量值。

其次,有人可以指出我用于迭代迭代符号的内存内容的功能!stl会这样做。我需要编写一个插件来转储我的一个矢量结构。

由于

1 个答案:

答案 0 :(得分:2)

我相信

没有错
DEBUG_ATTACH_NONINVASIVE|DEBUG_ATTACH_NONINVASIVE_NO_SUSPEND 

组合 - 它是完全允许的,甚至在断言样本中也有特色。 否则,就文档而言 - 它并不那么详细。我建议在 wt (跟踪和观察数据)的帮助下调试你的扩展 - 当你需要找到返回错误的确切子例程时,它会特别有用,这可能会让你更好地了解问题。

至于从扩展程序远程访问应用程序中的类型化数据,我发现ExtRemoteTyped类(在sdk子文件夹中的engextcpp.hpp中可用)非常有用且直观易用。