Аппаратная точка наблюдения GDB очень медленная - почему? - PullRequest
13 голосов
/ 15 марта 2010

В большом приложении 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

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

РЕДАКТИРОВАТЬ: удалены литой

РЕДАКТИРОВАТЬ: GDB 7,1

Ответы [ 4 ]

8 голосов
/ 11 сентября 2012

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

например.

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

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

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

5 голосов
/ 19 марта 2010

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

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

Может стоит попробовать.

5 голосов
/ 15 марта 2010

Скорее всего, потому что вы разыгрываете его каждый раз. Попробуйте это:

(gdb) watch *0x12F5D58

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

(gdb) info break

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

1 голос
/ 15 августа 2012

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

...