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