Портирование плагина WinDbg на расширение Visual Studio 2019 - PullRequest
2 голосов
/ 14 октября 2019

Я написал плагин WinDbg, чтобы помочь моим разработчикам в отладке наших приложений. В частности, он помогает запускать специальную диагностику для структур данных, найденных в нашем приложении, и предотвращает необходимость вручную проверять большое количество информации о структуре данных.

Сейчас я рассматриваю возможность переноса этого WinDbg в Visual Studio 2019 (как расширение VSIX), но я не знаю, с чего начать. Я могу исследовать, как написать такое расширение, но я не знаю, с чего начать искать связанный с отладчиком API в Visual Studio.

  • Есть ли простой способ повторно использовать плагин WinDbg вVisual Studio 2019? Это очень легко для меня?
  • Если нет, то каков API в Visual Studio для получения отладочной информации? Подумайте: чтение памяти, получение символов, получение адреса виртуальной таблицы, поиск в памяти, получение стека вызовов, получение общей информации? Я могу сделать все это в WinDbg через интерфейсы IDebug ... COM, но с чего мне начать в Visual Studio 2019?

1 Ответ

1 голос
/ 18 октября 2019

@ Патрик Я гуглил после того, как написал комментарий, но забыл обновить

кажется, что vs имеет свой собственный набор IDebugInterfaces, называемый IDebugEngine1,2 и т. Д.

я никогда не кодировал расширение против, нопытается булыжить, одна обновится, когда я получу время

, в то время как вы можете прочитать эту документацию

она выглядит как c #, и опять же, это не моя сильная стороналибо

Requirements

Header: Msdbg.h

Namespace: Microsoft.VisualStudio.Debugger.Interop

Assembly: Microsoft.VisualStudio.Debugger.Interop.dll

есть два предоставленных образца, к которым вы можете обратиться здесь

Я скачал этот образец , но не дал его достаточновремя

, и кажется, что API совершенно разные по сравнению с примером Прикрепить выглядит следующим образом

/* 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...