Я думаю, что на ваш вопрос есть только один ответ, который вы считаете «слишком много работающим». Однако я считаю, что это потому, что вы идете по этому пути неправильно. Позвольте мне представить шаги для добавления условной точки останова на Thread ID, которые чрезвычайно просты, но не очевидны, пока вы их не узнаете.
Остановка отладчика в точке, где вы находитесь в правильном потоке вы хотите продолжить отладку в (который я бы догадаться, как правило, первый поток, который попадает туда).
Введите $TID
в окно с часами.
Добавить точку останова с условием $TID == <
стоимостью $ TID от Watch Window>
,
Пример: $TID == 0x000016a0
Продолжить выполнение.
$TID
волшебная переменная для компиляторов Microsoft (так, по крайней мере Визуальная студии 2003), который имеет значение текущего Thread ID. Это делает его намного проще, чем смотреть (FS + 0x18) [0x24]. = D
При этом вы можете получить то же поведение, что и контрольные точки One-Shot отладчика с помощью некоторых простых макросов. Когда вы перешагиваетесь, отладчик, за кулисами, устанавливает точку останова, переходит к этой точке останова, а затем удаляет ее. Ключ к последовательному пользовательскому интерфейсу удаляет эти контрольные точки, если удалена точка останова . ЛЮБОЙ.
Следующие два макроса обеспечивают Step Over и Run To Cursor для текущего потока. Это выполняется так же, как и отладчик, причем точки останова удаляются после выполнения, независимо от того, какая точка останова ударяется.
Вам необходимо назначить комбинацию клавиш для их запуска.
Примечание: Один нюанс - Шаг За макросъемки работает только правильно, если курсор находится на линии, которую вы хотите перешагнуть. Это связано с тем, что он определяет текущее местоположение по местоположению курсора и просто добавляет его к номеру строки. Возможно, вы сможете заменить расчет местоположения информацией о текущей точке выполнения, хотя мне не удалось найти эту информацию в среде Macro IDE.
Здесь они и охота на удачу!
Для использования этих макросов в Visual Studio:
1. Откройте Macro IDE (из меню выберите: Tools-> Macros-> Macro IDE ...)
2. Добавить новый код файла (из меню: выберите: Проект-> Добавить новый элемент ..., выберите код файла и нажмите Добавить)
3. Вставить в этом коде.
4. Сохраните файл.
Чтобы добавить комбинации клавиш для запуска макросов в Visual Studio:
1. Откройте параметры (из меню, выберите: Сервис-> Параметры)
2. Заменяется > Клавиатура для окружающей среды
3. В Показать команды, содержащие:, тип Макросы. чтобы увидеть все ваши макросы.
4. Выберите макрос, а затем нажмите на Пресс горячих клавиш:
5. Тип комбо вы хотите использовать (забой удаляет набранные комбо)
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 и ранее.
Это работает для всех? Я не мог заставить его работать. –
Это работает для меня. = D В чем была ваша ошибка? – Aaron
@Aaron: Я использую VS 2008, когда я ввожу $ TID в окне Watch. Я получаю ошибку «Имя не существует в текущем контексте». – akif