Получить вывод выполненной команды windbg

Метод IDebugControl::Execute позволяет выполнять команды отладчика. Как я могу получить вывод выполненной команды отладчика? Моя цель - проверить, загружен ли драйвер, для этого я использую Execute, чтобы выполнить команду "lm" windbg и проанализировать возвращенный результат.

2 ответа

Вам нужно реализовать IDebugOutputCallbacks для примера. Взгляните на remmon out.cpp и out.hpp в образце windbg sdk (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

Как только у вас есть ваш клиент (IDebugClient*) и ваш контроль (IDebugControl*) экземпляры, из экземпляра клиента нужно вызвать IDebugClient::SetOutputCallbacksметод, который устанавливает обратный вызов вывода. Вам нужно установить обратный вызов вывода перед вызовом 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.cpp а также out.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;
}
Другие вопросы по тегам