Подтвердить что ты не робот

GDB аппаратная сторожевая точка очень медленная - почему?

В большом приложении C я установил сторожевую точку устройства на адрес памяти следующим образом:

(gdb) watch *0x12F5D58
Hardware watchpoint 3: *0x12F5D58

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

Теперь время работы приложения в отладчике изменилось с менее чем десяти секунд до одного часа и подсчета. Точка наблюдения срабатывала три раза до этого момента, первый раз через 15 минут, когда страница памяти, содержащая адрес, была прочитана с помощью sbrk. Разумеется, в течение этих 15 минут точка наблюдения должна была быть эффективной, поскольку страница памяти была недоступна? И это все еще не объясняет, почему это так медленно.

Платформа - x86_64, а версии GDB - пакет Ubuntu 9.10:

$ gdb --version
GNU gdb (GDB) 7.0-ubuntu
[...]

и запас GDB 7.1, построенный из источников:

$ gdb-7.1 --version
GNU gdb (GDB) 7.1

Заранее благодарим за любые идеи, что может быть причиной или как исправить/обойти его.

EDIT: удалено литье

EDIT: gdb 7.1

4b9b3361

Ответ 1

У меня действительно были проблемы с аппаратными точками наблюдения в GDB 7.x.x., что неприемлемо, поскольку точки наблюдения являются необходимостью в моей работе.

По совету со-работника я загрузил источник для 6.7.1 и построил его локально. Теперь точки наблюдения работают намного лучше.

Возможно, стоит попробовать.

Ответ 2

Я обнаружил, что просмотр большого символьного буфера очень медленный, тогда как просмотр символа в этом буфере был очень быстрым.

например.

static char buf[1024];
static char* buf_address = &buf;

watch buf_address - мучительно медленно.

watch *buf_address - очень быстро.

Ответ 3

Это, скорее всего, потому, что вы бросаете его каждый раз. Попробуйте следующее:

(gdb) watch *0x12F5D58

Другим вариантом является то, что у вас слишком много аппаратных точек наблюдения, поэтому gdb вынужден использовать контрольные точки программного обеспечения. Попробуйте проверить, сколько точек наблюдения вы используете:

(gdb) info break

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

Ответ 4

В x86 у вас есть следующее ограничение: все ваши точки наблюдения могут охватывать не более четырех адресов памяти, каждый адрес памяти может следить за одним словом памяти - это потому, что аппаратные точки наблюдения (быстрые) используют регистры отладки процессоров, у вас их четыре, поэтому четыре места для наблюдения.