Если вы работаете на Mac, архитектура x86_64 допускает 4 отдельных отслеживаемых области максимум по 8 байт каждая. В настоящее время lldb будет использовать только один регион для каждого запроса на просмотр. Он может объединять несколько областей наблюдения вместе для обработки больших запросов, которые будут работать для этой структуры. Не стесняйтесь подать запрос на улучшение для этой функции с http://bugs.llvm.org. Но точки наблюдения действительно ограничены в ресурсах, поэтому вам, как правило, нужно быть очень целеустремленным в отношении того, что вы пытаетесь наблюдать - возможно, поэтому никто не удосужился поддержать> 8 байтов.
Если вы хотите остановиться, когда элементы добавляются или удаляются из вектора, достаточно посмотреть на указатель конца в векторе (т.е. __end_
). Вы можете увидеть действительные значения вектора с аргументом --raw
для "frame var":
(lldb) fr v --raw arr
(std::__1::vector<int, std::__1::allocator<int> >) arr = {
std::__1::__vector_base<int, std::__1::allocator<int> > = {
__begin_ = 0x0000000100400000
__end_ = 0x000000010040001c
__end_cap_ = {
std::__1::__compressed_pair_elem<int *, 0, false> = {
__value_ = 0x0000000100400038
}
}
}
}
Всякий раз, когда вектор увеличивается или уменьшается, маркер конца корректируется, поэтому точка наблюдения устанавливается с помощью:
(lldb) watch set v arr.__end_
Watchpoint created: Watchpoint 1: addr = 0x7ffeefbff1c8 size = 8 state = enabled type = w
declare @ '/tmp/vectors.cpp:6'
watchpoint spec = 'arr.__end_'
new value: 0x000000010030020c
будет ловить push_back, стирать и т. Д.
Если вы хотите остановиться при изменении значений вектора, вам придется наблюдать за отдельными значениями; если вы будете играть только с 32 байтами, вы не будете смотреть все данные в векторе значимого размера. И, конечно, когда вектор изменяется, ваша точка наблюдения старых данных теперь будет указывать на свободную память ...