Настройка аппаратной точки наблюдения GDB / Как установить программную точку наблюдения

Предыдущий вопрос объяснил, что на x86 размер наблюдаемых объектов ограничен регистрами отладки. Как и ожидалось, я могу «смотреть» двойную переменную. Но я могу' Возможно, вы запросили слишком много аппаратных точек останова / наблюдения.

, хотя это только точка останова / наблюдения .

Мне любопытно, почему это так, но что более важно, есть ли способ обойти Это? Согласно документации GDB он может использовать программные точки наблюдения, если не может использовать аппаратное обеспечение. В этом случае он не пытается использовать программную точку наблюдения - есть ли способ заставить ее это сделать?

19
задан Peter Mortensen 31 January 2018 в 01:06
поделиться

2 ответа

Да, вы можете:

установить can-use-hw-watchpoints 0

Из 5.1.2 Установка точек наблюдения :

Вы можете заставить GDB использовать только программные точки наблюдения с помощью команды set can-use-hw-watchpoints 0. Если эта переменная установлена ​​в ноль, GDB никогда не будет пытаться использовать аппаратные точки наблюдения, даже если базовая система их поддерживает. (Обратите внимание, что аппаратные точки наблюдения, которые были установлены до установки can-use-hw-watchpoints на ноль, по-прежнему будут использовать аппаратный механизм отслеживания значений выражений.)

set can-use-hw-watchpoints

Установите, будет ли или не использовать аппаратные точки наблюдения.

show can-use-hw-watchpoints

Показать текущий режим использования аппаратных точек наблюдения.

19
ответ дан 30 November 2019 в 03:48
поделиться

Я не уверен на 100%, но я понимаю, что когда вы следите за pObject->dPrice, GDB пытается следить за всем, что может изменить наблюдаемое значение.

Используя программные сторожевые точки, после каждого шага GDB проверяет, изменилось ли выражение. Используя аппаратные точки наблюдения, GDB должен установить точку наблюдения для dprice, как вы и ожидали, а также для pObject.

Теперь, вы отметили вопрос 'x86'. На x86 вы можете установить точки останова на четыре байта. Двойка - это восемь байт. Если вы хотите наблюдать за двойкой, я бы предположил, что GDB понадобится две аппаратные точки наблюдения. Вам также нужна дополнительная точка наблюдения для pObject. Я предполагаю, что GDB пытается следить за all из pObject, что возвращается к проблеме в вопросе, на который вы ссылались в вопросе.

Когда я хочу сделать что-то подобное, если я уверен, что указатель pObject не изменится, я обычно делаю:

p &pObject->dprice

Допустим, GDB говорит, что адрес (double *) 0xabcdef10, теперь я делаю:

watch (double *) *0xabcdef10

и смотрю только то, что хочу.

Примечание: у меня перед глазами нет открытой GDB, поэтому я могу ошибиться с синтаксисом команды watch (относительно размещения *), поэтому сначала проверьте его.

7
ответ дан 30 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

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