1

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

cdb -p pid -pvr

如何使用我自己的使用调试引擎 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 那样迭代地转储符号的内存内容的函数。我需要编写一个插件来转储我的一个类似向量的结构。

谢谢

4

1 回答 1

2

我相信没有错

DEBUG_ATTACH_NONINVASIVE|DEBUG_ATTACH_NONINVASIVE_NO_SUSPEND 

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

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

于 2009-06-04T13:10:16.960 回答