Установка точки останова данных в Visual Studio 2005 по адресу разыменованного указателя - PullRequest
4 голосов
/ 08 октября 2008

Интересно, есть ли способ сделать следующее: у меня есть структура, содержащая член, который является указателем на блок памяти, выделенный ядром, когда я передаю структуру в функцию API (структура - WAVEHDR, членом является зарезервированное поле.)

Я могу установить точку останова данных на значение зарезервированного члена - что само по себе не очень полезно. Что бы я хотел сделать, когда достигается точка останова, это разыменовать указатель, хранящийся в зарезервирован , и установить новую точку останова данных в памяти, на которую указывает этот указатель. Я хотел бы, чтобы VisualStudio ломался, когда для этой памяти установлено известное значение.

Я знаю, как установить точку останова из макроса и как Visual Studio может вызывать этот макрос из точки останова при его попадании, но я не знаю, могу ли я передать значение указателя в макрос, чтобы он мог установите точку останова на правильном адресе. Пользовательский интерфейс не предоставляет способ сделать это.

Есть ли способ для макроса получить доступ к информации о запущенной программе и выполнять такие вещи, как вычисление глобальных переменных или других выражений? Я мог бы выполнить то, что я пытаюсь сделать, если бы у меня был такой программный доступ к исполняемому коду (во время точки останова) из макроса.

Ответы [ 2 ]

2 голосов
/ 09 октября 2008

Макрос может оценить все, что вы можете в окне просмотра:

    Dim e As EnvDTE.Expression

    e = DTE.Debugger.GetExpression("<my expression>", True)

    If e.IsValidValue Then
        ... use e.Value to do something
    End If

Значение, которое вы возвращаете в e.Value, - это именно та строка, которую вы видите в окне просмотра, поэтому вам, возможно, придется ее разделить. Есть также множество других свойств объекта Expression, которые вы можете использовать. См. документацию MSDN .

0 голосов
/ 08 октября 2008

Я не уверен, что это возможно. Я знаю, что есть условные точки останова, но для этого нужно заранее знать адрес памяти ...

Что-то вроде * p == 0xADDRESS в диалоговом окне условного разрыва.

...