GDB аппаратная точка наблюдения очень медленно-почему?
в большом приложении C я установил аппаратную контрольную точку на адрес памяти следующим образом:
(gdb) watch *0x12F5D58
Hardware watchpoint 3: *0x12F5D58
как вы можете видеть, это аппаратная точка наблюдения, а не программное обеспечение, которое объяснило бы медлительность.
теперь время работы приложения под отладчиком изменилось с менее чем десяти секунд до одного часа и подсчета. Watchpoint срабатывал три раза до сих пор, первый раз после 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
заранее спасибо за любые идеи, как то, что может быть причиной или как исправить/обойти его.
редактировать: удален cast
EDIT: gdb 7.1
4 ответов
У меня действительно были проблемы с аппаратными точками наблюдения в GDB 7.X. x., что неприемлемо, так как точки наблюдения являются необходимостью в моей работе.
по совету коллеги я загрузил источник для 6.7.1 и построил его локально. Теперь точки наблюдения работают намного лучше.
возможно, стоит попробовать.
я обнаружил, что наблюдение за большим буфером символов было очень медленным, в то время как наблюдение за символом в этом буфере было очень быстрым.
например
static char buf[1024];
static char* buf_address = &buf;
это скорее всего потому, что вы разыгрываете его каждый раз. Попробуйте это:
(gdb) watch *0x12F5D58
другой вариант заключается в том, что у вас слишком много аппаратных контрольных точек, поэтому gdb вынужден использовать программные контрольные точки. Попробуйте проверить сколько точек вы используете:
(gdb) info break
и посмотреть, можно ли отключить некоторые точки наблюдения.
на x86 у вас есть следующее ограничение: все ваши контрольные точки могут охватывать не более четырех адресов памяти, каждый адрес памяти может следить за одним словом памяти - это потому, что аппаратные контрольные точки (быстрые) используют регистры отладки процессоров, у вас есть четыре из них, поэтому четыре места для наблюдения.