获取执行的windbg命令的输出

时间:2015-12-26 09:46:53

标签: c++ debugging windbg dbgeng

IDebugControl :: Execute方法可以执行调试器命令。 如何获取执行的调试器命令的输出? 我的目的是检查驱动程序是否已加载,以完成我使用Execute执行“lm”windbg命令并解析返回的输出。

2 个答案:

答案 0 :(得分:1)

你需要为样本实现IDebugOutputCallbacks,看一下windbg sdk示例中的remmon out.cpp和out.hpp(iirc new sdks不包含你需要从msdn样本库在线获取它的样本)

class StdioOutputCallbacks : public IDebugOutputCallbacks
{
public:
............
}

StdioOutputCallbacks g_Callback;

status = g_Client->SetOutputCallbacks( &g_Callback );

示例虚拟实现将两个文件out.cpp和out.hpp复制到本地文件夹构建并执行以显示警告和.echo执行的输出

//error,relasese() omitted Do_Nothing_sample no proc|thread warn print exit; 
#include <engextcpp.hpp>
#include "out.hpp"
#include "out.cpp"
extern StdioOutputCallbacks g_OutputCb; 
void __cdecl main( void ){
    IDebugClient*   g_Client = NULL;
    IDebugControl*  g_Control= NULL;
    DebugCreate( __uuidof(IDebugClient), (void**)&g_Client );
    g_Client->QueryInterface( __uuidof(IDebugControl), (void**)&g_Control );
    g_Client->SetOutputCallbacks( &g_OutputCb );
    g_Control->Execute( DEBUG_OUTCTL_THIS_CLIENT, 
  ".echo hello iam alive and kicking", DEBUG_EXECUTE_DEFAULT);  
}

构建和执行的结果

    3 files compiled
    1 executable built

WARNING: The debugger does not have a current process or thread
WARNING: Many commands will not work
hello iam alive and kicking

答案 1 :(得分:1)

从客户端实例获得客户端(IDebugClient*)和控件(IDebugControl*)实例后,您需要调用设置IDebugClient::SetOutputCallbacksoutput callback方法。您需要在调用execute()方法之前设置输出回调

这应该是这样的:

StdioOutputCallbacks g_OutputCb;

// ...

g_Client->SetOutputCallbacks(&g_OutputCb);
g_Control->Execute(DEBUG_OUTCTL_ALL_CLIENTS,"lm vm", DEBUG_EXECUTE_ECHO);

您的输出回调必须继承自IDebugOutputCallbacks

class StdioOutputCallbacks : public IDebugOutputCallbacks

执行此操作的简单方法是直接复制并使用实现回调类的out.cppout.hpp文件(存在于某些示例中),例如。在:

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sdk\samples\dumpstk

输出本身在IDebugOutputCallbacks::Output实现中完成:

STDMETHODIMP
StdioOutputCallbacks::Output(
    THIS_
    _In_ ULONG Mask,
    _In_ PCSTR Text
    )
{
    UNREFERENCED_PARAMETER(Mask);
    fputs(Text, stdout);
    return S_OK;
}