Я пытаюсь отобразить трассировку стека волокон 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
Трассировка стека волокон VSPackage ⇐ C#
Место общения программистов C#
1763485242
Anonymous
Я пытаюсь отобразить трассировку стека волокон RTOS, работающих в решении C++ в VS2022. После обновления до Windows 11, похоже, возникла проблема с реализацией. Существующий подход, который работал с VS2013 и VS2019, использует переключение контекста для переключения контекста волокна с помощью фиктивного потока (который всегда приостановлен).
Я написал VSPackage, который использует события отладчика для обработки переключения контекста и реагирования на события. Когда отладчик останавливается, я переключаю контексты, а затем, когда начинается выполнение, я восстанавливаю исходный контекст потока. [b]Если отладчик останавливается на точке останова, все в порядке и стеки фиктивных потоков верны. Если я вхожу/выхожу/перехожу к выполнению или нажимаю паузу, даже если контекст был переключен, он отображается неправильно[/b].
Один метод, который я пробовал, — это использовать рабочий поток в моем 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]);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79823335/vspackage-fibers-stack-tracing[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия