微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在WinDbg扩展中调用IDbgConsole.PrintTextToConsole时发生异常

如何解决在WinDbg扩展中调用IDbgConsole.PrintTextToConsole时发生异常

我正在尝试用C#编写windbbg扩展。该扩展只是一个非常基本的功能,应该只在控制台上打印一条语句,但是当我加载扩展并运行命令时,出现以下错误

0:005> !testCommand
e0434352 Exception in C:\Users\test\AppData\Local\Dbg\EngineExtensions\WinDbgExtension.dll.testCommand debugger extension.
      PC: 00007ffe`42183b29  VA: 00000000`00000000  R/W: 80070002  Parameter: 00000000`00000000

代码

using System;
using System.Runtime.InteropServices;
using RGiesecke.DllExport;
using DbgX.Interfaces;
using DbgX.Interfaces.Enums;
using DbgX.Interfaces.Listeners;
using DbgX.Interfaces.Services;
using System.ComponentModel.Composition;

namespace WindbgExt
{
    public class Extension
    {

        [Import]
        private static IDbgConsole _console;

        [DllExport("testCommand")]
        public static void testCommand(IntPtr client,[MarshalAs(UnmanagedType.LPStr)] string args)
        {
            _console.PrintTextToConsole("This worked");
        }

        [DllExport("DebugExtensionInitialize")]
        public static int DebugExtensionInitialize(ref uint version,ref uint flags)
        {
            version = DEBUG_EXTENSION_VERSION(1,0);
            flags = 0;
            return 0;
        }

        private static uint DEBUG_EXTENSION_VERSION(uint Major,uint Minor) => ((Major & 0xffff) << 16) | (Minor & 0xffff);
    }
}

WinDbg可以识别扩展名和命令。但是我不知道这个错误是什么意思或可能导致它的原因。我们将不胜感激,帮助您确定导致错误的原因。

编辑1:
在阅读了一些注释之后,我进行了一些测试,并注释掉了_console.PrintTextToConsole("This worked");行,以防止引发错误。我希望问题出在接口的声明方式上,但我不知道如何纠正它。我曾尝试将类和接口设置为静态,但这并不能纠正这种情况。

编辑2:
我现在尝试声明一个IDbgConsole实例,并以我能想到的所有方式调用PrintTextToConsole,但是它们全部都会产生以下错误。即使将其包装在try and catch块中也无济于事,因为未触发catch部分。如果有另一种写入控制台的方法解决错误要容易得多,那么该错误也可以作为解决方案。

解决方法

您在这里混合了两个概念。 Windbg扩展有两种:调试器扩展和UI扩展。

  • UI扩展由WPF Shell自动加载(假设您将它们放在正确的文件夹中)。我写了a few articles about them,但API仍未记录。借助UI扩展,您可以使用MEF和诸如IDbgConsole之类的服务,但不能直接与调试器进行交互(必须找到正确的服务并使用它来发送命令)

  • 调试器扩展是在单独的进程中加载​​的。它们已加载.load.loadby命令。它们使您可以直接与调试引擎进行交互。通过这些扩展,如果您使用本机导出工具,例如RGiesecke.DllExport,则可以公开新命令。重要的是要了解它们在单独的进程中运行,并且与UI完全隔离。 您不能从那里使用MEF和IDbgConsole之类的服务。

在您的情况下,您似乎只是想在控制台上打印内容。您可以通过使用IDebugControl对象来实现。编写包装它的流并将其设置为控制台输出流会更容易,因此您只需使用Console.WriteLine。在ClrMD github存储库(DbgEngStream类)上有一个示例,该示例为:https://github.com/microsoft/clrmd/blob/18c9e1304228d375191b5f805b7a5d9da2ec86ef/src/Samples/WindbgExtension/Common.cs

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。