Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WinDbg扩展无法识别命令_C#_Windbg - Fatal编程技术网

C# WinDbg扩展无法识别命令

C# WinDbg扩展无法识别命令,c#,windbg,C#,Windbg,我正在尝试编写WinDbg扩展命令,但遇到了一些问题。我从project开始,并试图修改它以在调试器中提供自定义命令 但是,当我运行TestCommand时,我得到以下错误 命令是:!TestCommand这是一个test0:000>!TestCommand这是一个测试 未找到导出测试命令 我的完整代码如下。我已尝试将[Export]修饰符添加到TestCommand函数中,但这并没有纠正这种情况。如何让WinDbg识别该命令 完整扩展代码: using System.ComponentMode

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

但是,当我运行
TestCommand
时,我得到以下错误

命令是:!TestCommand这是一个test0:000>!TestCommand这是一个测试
未找到导出测试命令

我的完整代码如下。我已尝试将
[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扩展时相同的错误消息

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

在给定的源代码中,您可以在WinDbgScriptRunner.x64和WinDbgScriptRunner.x86项目中找到“常规”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
我在他们的Github存储库中添加了这一点

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

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

您可以将此重新用于

*!TestCommand
代码是

if (command.StartsWith("*!TestCommand"))
{
  _console.PrintTextToConsole("My command was invoked! Yay!\r\n");
  return;
}
输出也有点笨拙,因为代码是在实际命令写入窗口之前执行的:

(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 Preview编写UI扩展,因此我不确定这种方法能走多远,以及是否能修改输出顺序。

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

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

在给定的源代码中,您可以在WinDbgScriptRunner.x64和WinDbgScriptRunner.x86项目中找到“常规”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
我在他们的Github存储库中添加了这一点

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

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

您可以将此重新用于

*!TestCommand
代码是

if (command.StartsWith("*!TestCommand"))
{
  _console.PrintTextToConsole("My command was invoked! Yay!\r\n");
  return;
}
输出也有点笨拙,因为代码是在实际命令写入窗口之前执行的:

(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 Preview编写UI扩展,因此我不确定这种方法能走多远,以及是否能确定输出顺序