Я пытаюсь отобразить трассировку стека волокон RTOS, работающих в решении C++ в VS2022. После обновления до Windows 11, похоже, возникла проблема с реализацией. Существующий подход, который работал с VS2013 и VS2019, использует переключение контекста для переключения контекста волокна с помощью фиктивного потока (который всегда приостановлен).
Я написал VSPackage, который использует события отладчика для обработки переключения контекста и реагирования на события. Когда отладчик останавливается, я переключаю контексты, а затем, когда начинается выполнение, я восстанавливаю исходный контекст потока. Если отладчик останавливается на точке останова, все в порядке и стеки фиктивных потоков верны. Если я вхожу/выхожу/перехожу к выполнению или нажимаю паузу, даже если контекст был переключен, он отображается неправильно.
Один метод, который я пробовал, — это использовать рабочий поток в моем VSPackage, чтобы заморозить/приостановить все потоки, кроме одного, попытаться выполнить пошаговый код для этого потока, а затем разморозить/возобновить другие потоки. Однако я считаю этот метод ненадежным. Я хочу заставить окно потоков VS2022 обновиться, но ИИ предполагает, что это невозможно.
Мой вопрос: пробовал ли кто-нибудь еще что-то подобное и добился ли он успеха?
Предоставление кода было бы слишком сложным, но базовый псевдокод приведен ниже. Он написан на C#
//Contains fiber information plus the dummy thread ID
// for each fiber and fiber and thread contexts
FiberArray[];
//Debugger event
public int OnModeChange(DBGMODE mode)
{
if (DBGMODE.DBGMODE_Break == mode)
{
SwitchFiberContexts();
}
else if (DBGMODE.DBGMODE_Run == mode)
{
for (int f = 0; f < FiberArray.Count, ++f)
{
RestoreWindowsThreadContext(FiberArray[f]);
}
}
}
private void SwitchFiberContexts()
{
//Read register contexts for fibers from process being debugged
//...
//...
for (int f = 0; f < FiberArray.Count, ++f)
{
StoreWindowsThreadContext(FiberArray[f]);
//Replace dummy thread context with fiber context
ReplaceWindowsThreadContext(FiberArray[f]);
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... ck-tracing