WinDbg 扩展无法识别命令

WinDbg extension not recognizing command

我正在尝试编写 WinDbg 扩展命令并 运行遇到一些问题。我从 this 项目开始,并尝试修改它以在调试器中提供自定义命令。

但是,当我 运行 TestCommand 时,出现以下错误。

The command was: !TestCommand this is a test0:000> !TestCommand this is a test No export TestCommand found

我的完整代码如下。我曾尝试将 [Export] 修饰符添加到 TestCommand 函数,但这并没有纠正这种情况。我如何让 WinDbg 识别命令?

完整扩展代码:

using System.ComponentModel.Composition;
using DbgX.Interfaces;
using DbgX.Interfaces.Enums;
using DbgX.Interfaces.Listeners;
using DbgX.Interfaces.Services;
using DbgX.Util;

namespace WinDbgExt.LoadSos
{
    [Export(typeof(IDbgCommandExecutionListener))]
    [Export(typeof(IDbgStartupListener))]

    public class ToggleSosViewModel : IDbgCommandExecutionListener, IDbgStartupListener
    {
        private bool _engineLoaded;

        [Import]
        private IDbgConsole _console;

        [Import]
        private IDbgEngineState _engineState;

        public void OnCommandExecuted(string command)
        {
            if (command.StartsWith("!TestCommand"))
            {
                TstCommand(command);

            }
        }

        public void TestCommand(string command)
        {
            _console.PrintTextToConsole("The command was: " + command);
        }

        public void OnStartup()
        {

        }
    }
}

作为附加问题,我需要获得 WinDbg 所附加的进程的句柄。有没有一种简单的方法可以将其添加到上述扩展中?

我认为存在误会。 OnCommandExecuted() 是一个事件侦听器,当您在 WinDbg 中输入命令时会调用它。您编译的给定 UI 扩展将首先收到有关该命令的通知,然后 WinDbg 将尝试实际 运行 该命令。由于该命令不存在,它会响应您在未加载 UI 扩展程序时收到的相同错误消息。

如果我正确理解你想要什么,那么你正在尝试实现一个实现命令 !TestCommand 的 WinDbg 扩展(而不是 UI 扩展)。这通常是一种完全不同的方法。

在给定的源代码中,您在 WinDbgScriptRunner.x64 和 WinDbgScriptRunner.x86 项目中找到 "regular" WinDbg 扩展。在那里你可以看到你需要

[DllExport("compileandrun")]

关于使方法成为 ! 命令的方法。

但是,不幸的是,他们失败了,有一个例外:

0:000> !compileandrun
e0434352 Exception in C:\Users\T\AppData\Local\dbg\UIExtensions\CsharpScriptRunner-x64\WindbgScriptRunner.dll.compileandrun debugger extension.
      PC: 00007ff9`c183a799  VA: 00000000`00000000  R/W: 8013150c  Parameter: 00000000`00000000

我已将其作为 issue #4 添加到他们的 Github 存储库中。

所以,是的,我知道如果您想在 C# 中实现扩展有点棘手。那么,您怎么能滥用给定的功能并执行命令呢?

唯一没有副作用的命令可能是 comment 命令:

* this is a comment

您可以将其重新用于

*!TestCommand

代码是

if (command.StartsWith("*!TestCommand"))
{
  _console.PrintTextToConsole("My command was invoked! Yay!\r\n");
  return;
}

输出也有点尴尬,因为你的代码是在实际命令写入 window:

之前执行的
(4b34.1954): Break instruction exception - code 80000003 (first chance)
ntdll!LdrpDoDebuggerBreak+0x30:
00007ff9`c3dd119c cc              int     3
My command was invoked! Yay!
0:000> *!TestCommand

我不熟悉为 WinDbg 预览版编写 UI 扩展,所以我不确定您可以使用这种方法走多远以及是否可以修复输出顺序。