На большом приложении 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
У меня действительно были проблемы с аппаратными точками наблюдения в GDB 7.xx, что неприемлемо, поскольку точки наблюдения необходимы в моей работе.
По совету коллеги я загрузил исходный код для 6.7.1 и собрал его локально. Точки наблюдения теперь работают намного лучше.
Возможно, стоит попробовать.
Скорее всего, потому, что вы каждый раз разыгрываете его. Попробуйте следующее:
(gdb) watch *0x12F5D58
Другой вариант - у вас установлено слишком много аппаратных точек наблюдения, поэтому GDB вынужден использовать программные точки наблюдения. Попробуйте проверить, сколько точек наблюдения вы используете:
(gdb) info break
и посмотрите, можно ли отключить некоторые точки наблюдения.