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