“Переступите” при отладке многопоточных программ в Visual Studio

27
задан Peter Mortensen 25 September 2012 в 18:18
поделиться

2 ответа

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

  1. Остановка отладчик в точке, где Вы находитесь в корректном потоке, Вы хотите продолжить отлаживать в (, который я предположил бы, обычно первый поток, который добирается там ).

  2. Входят $TID в окно часов.

  3. Добавляют точку останова с условием $TID == < значение $TID от Примера Окна >,
    Часов : $TID == 0x000016a0

  4. Продолжают Выполнение.

$TID волшебная переменная для компиляторов Microsoft (так как, по крайней мере, Visual  Studio  2003), который имеет значение идентификатора текущего потока. Это делает его намного легче, чем рассмотрение (FS+0x18) [0x24]. =D

Однако можно получить то же поведение как точки останова отладчика С одним выстрелом с некоторыми простыми макросами. Когда Вы переступаете, отладчик, негласно, устанавливает точку останова, работает к той точке останова и затем удаляет ее. Ключ к последовательному пользовательскому интерфейсу удаляет те точки останова, если КАКОЙ-ЛИБО точка останова поражена.

следующие два макросов обеспечивают , Переступают и Выполнение К Курсору для текущего потока. Это выполняется таким же образом как отладчик с точками останова, удаляемыми после выполнения, независимо от которого поражена точка останова.

Вы захотите присвоить сочетание клавиш для выполнения их.

ПРИМЕЧАНИЕ : Один протест - Эти Переступает , макрос только работает правильно, если курсор находится на строке, Вы хотите переступить. Это вызвано тем, что это определяет текущее местоположение позицией курсора, и просто добавляет ту к номеру строки. Можно быть в состоянии заменить вычисление местоположения информацией о текущей точке выполнения, хотя я был неспособен определить местоположение той информации от Макро-IDE.

Здесь они и поиск ошибки удачи!!

Для использования их макросы в Visual Studio:
1. Откройте Macro IDE (из Меню, выберите: Инструменты-> Макросы-> Макро-IDE... )
2. Добавьте новый Файл кода (из Меню: выберите: Проект-> Добавляют Новый Объект... , выберите Code File и нажмите Add)
3. Вставка в этом коде.
4. Сохраните файл.

Для добавления сочетаний клавиш для выполнения их макросы в Visual Studio:
1. Откройте Options (из Меню, выберите: Инструменты-> Опции )
2. Расширьтесь до [1 131] Среда-> Клавиатура
3. В [1 132] Выставочные команды, содержащие: , Макросы типа . для наблюдения всех макросов.
4. Выберите макрос, затем нажмите в [1 134] сочетания клавиш Нажатия:
5. Введите комбинацию, которую Вы хотите использовать (, клавиша Backspace удаляет введенные комбинации )
6. нажмите Assign для установки ярлыка для выполнения выбранного макроса.

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics

Public Module DebugHelperFunctions

    Sub RunToCursorInMyThread()
        Dim textSelection As EnvDTE.TextSelection
        Dim myThread As EnvDTE.Thread
        Dim bp As EnvDTE.Breakpoint
        Dim bps As EnvDTE.Breakpoints

        ' For Breakpoints.Add()
        Dim FileName As String
        Dim LineNumber As Integer
        Dim ThreadID As String

        ' Get local references for ease of use 
        myThread = DTE.Debugger.CurrentThread
        textSelection = DTE.ActiveDocument.Selection

        LineNumber = textSelection.ActivePoint.Line
        FileName = textSelection.DTE.ActiveDocument.FullName
        ThreadID = myThread.ID

        ' Add a "One-Shot" Breakpoint in current file on current line for current thread
        bps = DTE.Debugger.Breakpoints.Add("", FileName, LineNumber, 1, "$TID == " & ThreadID)

        ' Run to the next stop
        DTE.Debugger.Go(True)

        ' Remove our "One-Shot" Breakpoint
        For Each bp In bps
            bp.Delete()
        Next
    End Sub

    Sub StepOverInMyThread()
        Dim textSelection As EnvDTE.TextSelection
        Dim myThread As EnvDTE.Thread
        Dim bp As EnvDTE.Breakpoint
        Dim bps As EnvDTE.Breakpoints

        ' For Breakpoints.Add()
        Dim FileName As String
        Dim LineNumber As Integer
        Dim ThreadID As String

        ' Get local references for ease of use 
        myThread = DTE.Debugger.CurrentThread
        textSelection = DTE.ActiveDocument.Selection

        LineNumber = textSelection.ActivePoint.Line
        FileName = textSelection.DTE.ActiveDocument.FullName
        ThreadID = myThread.ID
        LineNumber = LineNumber + 1

        ' Add a "One-Shot" Breakpoint in current file on current line for current thread
        bps = DTE.Debugger.Breakpoints.Add("", FileName, LineNumber, 1, "$TID == " & ThreadID)

        ' Run to the next stop
        DTE.Debugger.Go(True)

        ' Remove our "One-Shot" Breakpoint
        For Each bp In bps
            bp.Delete()
        Next
    End Sub


End Module

Правовая оговорка : Я записал им макросы в [1 137] Visual Studio 2005 . Можно, вероятно, использовать их прекрасный в [1 138] Visual Studio 2008 . Они могут потребовать модификации для [1 139] Visual Studio 2003 и прежде.

41
ответ дан Peter Mortensen 28 November 2019 в 04:30
поделиться

Можно заморозить различный поток или переключиться на другой поток с помощью окна отладки Потоков ( Ctrl + Высокий звук + H ).

21
ответ дан Peter Mortensen 28 November 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: