Ответ 1
Я думаю, что есть только один ответ на ваш вопрос, который вы уклонились от того, чтобы "слишком много работать". Однако я считаю, что это потому, что вы идете по этому пути неправильно. Позвольте мне представить шаги для добавления условной точки останова на Thread ID, которые чрезвычайно просты, но не очевидны, пока вы их не узнаете.
-
Остановите отладчик в том месте, где вы находитесь в правильном потоке, который хотите продолжить отладку (который, как я предполагал, обычно является первым потоком, который попадает туда).
-
Введите
$TID
в окно просмотра. -
Добавить точку останова с условием
$TID == <
значения $TID из окна просмотра>
,
Пример:$TID == 0x000016a0
-
Продолжить выполнение.
$TID
- волшебная переменная для компиляторов Microsoft (по крайней мере, Visual Studio 2003), которая имеет значение текущего идентификатора потока. Это делает его намного проще, чем смотреть (FS + 0x18) [0x24]. = D
При этом вы можете получить то же поведение, что и контрольные точки One-Shot отладчика с некоторыми простыми макросами. Когда вы перешагиваетесь, отладчик, за кулисами, устанавливает точку останова, переходит к этой точке останова, а затем удаляет ее. Ключ к последовательному пользовательскому интерфейсу удаляет эти точки останова, если удалена точка останова ЛЮБОЙ.
Следующие два макроса предоставляют Step Over и Run To Cursor для текущего потока. Это выполняется так же, как и отладчик, причем точки останова удаляются после выполнения, независимо от того, какая точка останова была удалена.
Вы хотите назначить комбинацию клавиш для их запуска.
ПРИМЕЧАНИЕ: одно предупреждение - макрос "Step Over" работает только корректно, если курсор находится в строке, которую вы хотите перешагнуть. Это связано с тем, что он определяет текущее местоположение по местоположению курсора и просто добавляет его к номеру строки. Возможно, вы сможете заменить расчет местоположения информацией о текущей точке выполнения, хотя мне не удалось найти эту информацию в среде Macro IDE.
Вот они и охота на удачу удачи!!
Чтобы использовать эти макросы в Visual Studio:
1. Откройте Macro IDE (в меню выберите: Инструменты- > Макросы- > Макро-IDE...)
2. Добавьте новый файл кода (из меню: выберите: Project- > Добавить новый элемент..., выберите "Файл кода" и нажмите "Добавить" )
3. Вставьте в этот код.
4. Сохраните файл.Чтобы добавить комбинации клавиш для запуска этих макросов в Visual Studio:
1. Откройте" Параметры "(в меню выберите" Инструменты "-" Параметры ")
2. Разверните в Environment- > Keyboard
3. В командах Show, содержащих:, введите Макросы., чтобы просмотреть все ваши макросы.
4. Выберите макрос, затем нажмите "Нажмите". Нажмите клавиши быстрого доступа:
5. Введите комбо, которое вы хотите использовать (backspace удаляет типизированные комбо)
6. Нажмите "Назначить", чтобы настроить ярлык для запуска выбранного макроса.
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
Отказ от ответственности. Я написал эти макросы в Visual Studio 2005. Возможно, вы можете использовать их в Visual Studio 2008. Они могут потребовать изменения для Visual Studio 2003 и раньше.