将 WinDbg 插件移植到 Visual Studio 2019 扩展
Porting WinDbg plugin to Visual Studio 2019 extension
我编写了一个 WinDbg 插件来帮助我的开发人员调试我们的应用程序。更具体地说,它有助于 运行 对我们应用程序中发现的数据结构进行特殊诊断,并防止开发人员必须手动检查大量数据结构信息。
我现在正在考虑将此 WinDbg 移植到 Visual Studio 2019(作为 VSIX 扩展),但我不知道从哪里开始。我可以研究如何编写这样的扩展,但我不知道从哪里开始在 Visual Studio.
中寻找与调试器相关的 API
- 在 Visual Studio 2019 年是否有一种简单的方法来重用 WinDbg 插件?这对我来说会很容易吗?
- 如果不是,Visual Studio中的API是什么来获取调试信息的?想一想:读取内存、获取符号、获取 vtable 的地址、搜索内存、获取调用堆栈、获取通用信息?我可以通过 IDebug...COM 接口在 WinDbg 中完成所有这些操作,但是在 Visual Studio 2019 年我从哪里开始?
@Patrick 我在写评论后谷歌搜索但忘记更新
看起来 vs 有自己的 IDebugInterface 集,称为 IDebugEngine1、2 等
我从未编写过 vs 扩展程序,但正在尝试拼凑一个,当我有时间时会更新
与此同时你可以通读这篇文章 documentation
它似乎是 c#,而且这也不是我的强项
Requirements
Header: Msdbg.h
Namespace: Microsoft.VisualStudio.Debugger.Interop
Assembly: Microsoft.VisualStudio.Debugger.Interop.dll
提供了两个示例,您可以参考here
我下载了这个 sample 但没有给它足够的时间
看起来 api 与 windbg 完全不同,示例 Attach 如下所示
/* static */
DebuggedProcess^ Worker::AttachToProcess(ISampleEngineCallback^ callback, int processId)
{
ASSERT(Worker::MainThreadId != Worker::CurrentThreadId);
HANDLE hProcess = Win32HandleCall( ::OpenProcess(
PROCESS_ALL_ACCESS,
FALSE,
processId
));
String^ nameFromHandle = GetProcessName(hProcess);
String^ processName = System::IO::Path::GetFullPath(nameFromHandle);
Win32BoolCall( ::DebugActiveProcess(
processId
) );
DebuggedProcess^ process = gcnew DebuggedProcess(Attach, callback, hProcess, processId, processName);
return process;
}
我编写了一个 WinDbg 插件来帮助我的开发人员调试我们的应用程序。更具体地说,它有助于 运行 对我们应用程序中发现的数据结构进行特殊诊断,并防止开发人员必须手动检查大量数据结构信息。
我现在正在考虑将此 WinDbg 移植到 Visual Studio 2019(作为 VSIX 扩展),但我不知道从哪里开始。我可以研究如何编写这样的扩展,但我不知道从哪里开始在 Visual Studio.
中寻找与调试器相关的 API- 在 Visual Studio 2019 年是否有一种简单的方法来重用 WinDbg 插件?这对我来说会很容易吗?
- 如果不是,Visual Studio中的API是什么来获取调试信息的?想一想:读取内存、获取符号、获取 vtable 的地址、搜索内存、获取调用堆栈、获取通用信息?我可以通过 IDebug...COM 接口在 WinDbg 中完成所有这些操作,但是在 Visual Studio 2019 年我从哪里开始?
@Patrick 我在写评论后谷歌搜索但忘记更新
看起来 vs 有自己的 IDebugInterface 集,称为 IDebugEngine1、2 等
我从未编写过 vs 扩展程序,但正在尝试拼凑一个,当我有时间时会更新
与此同时你可以通读这篇文章 documentation
它似乎是 c#,而且这也不是我的强项
Requirements
Header: Msdbg.h
Namespace: Microsoft.VisualStudio.Debugger.Interop
Assembly: Microsoft.VisualStudio.Debugger.Interop.dll
提供了两个示例,您可以参考here
我下载了这个 sample 但没有给它足够的时间
看起来 api 与 windbg 完全不同,示例 Attach 如下所示
/* static */
DebuggedProcess^ Worker::AttachToProcess(ISampleEngineCallback^ callback, int processId)
{
ASSERT(Worker::MainThreadId != Worker::CurrentThreadId);
HANDLE hProcess = Win32HandleCall( ::OpenProcess(
PROCESS_ALL_ACCESS,
FALSE,
processId
));
String^ nameFromHandle = GetProcessName(hProcess);
String^ processName = System::IO::Path::GetFullPath(nameFromHandle);
Win32BoolCall( ::DebugActiveProcess(
processId
) );
DebuggedProcess^ process = gcnew DebuggedProcess(Attach, callback, hProcess, processId, processName);
return process;
}