【问题标题】:How to attach to a already running process noninvasively如何以非侵入方式附加到已经运行的进程
【发布时间】:2009-06-04 21:10:16
【问题描述】:

我在 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 那样迭代地转储符号的内存内容的函数。我需要编写一个插件来转储我的一个矢量结构。

谢谢

【问题讨论】:

    标签: windows debugging windbg


    【解决方案1】:

    我相信没有错

    DEBUG_ATTACH_NONINVASIVE|DEBUG_ATTACH_NONINVASIVE_NO_SUSPEND

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

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

    【讨论】:

    • 我按照你的建议让它工作了。当进程已被另一个调试器挂起时,组合 DEBUG_ATTACH_NONINVASIVE|DEBUG_ATTACH_NONINVASIVE_NO_SUSPEND 不起作用,但 DEBUG_ATTACH_NONINVASIVE 起作用。获取调用堆栈的问题与 WaitForEvent 调用有关。 ExtRemoteTyped 以及 engextcpp.hpp 中的许多其他类都非常好,并且解决了大部分问题
    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多