Трассировка стека волокон VSPackageC#

Место общения программистов C#
Ответить
Anonymous
 Трассировка стека волокон VSPackage

Сообщение Anonymous »

Я пытаюсь отобразить трассировку стека волокон 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»