Установка точек наблюдения для больших структур данных в lldb

Я изучаю lldb, и мне любопытно, как вы настраиваете точки наблюдения для больших структур данных, например для вектора. Я знаю, что могу использовать печать, и это работает, но я получаю сообщение о том, что точки наблюдения размера «x» не поддерживаются. Это можно обойти? Спасибо за помощь!

(lldb) s
Process 36110 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = step in
frame #0: 0x0000000100001600 a.out`main at test.cpp:10
7        vector<int> arr;
8        arr.push_back(1);
9        arr.push_back(2);
-> 10       arr.push_back(3);
11       arr.push_back(4);
12       arr.push_back(5);
13
Target 0: (a.out) stopped.
(lldb) print arr
(std::__1::vector<int, std::__1::allocator<int> >) $2 = size=2 {
[0] = 1
[1] = 2
}
(lldb) w s v arr
error: Watchpoint creation failed (addr=0x7ffeefbff458, size=24, variable expression='arr').
error: watch size of 24 is not supported

2

Решение

Если вы работаете на 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 байтами, вы не будете смотреть все данные в векторе значимого размера. И, конечно, когда вектор изменяется, ваша точка наблюдения на старых данных теперь будет указывать на свободную память …

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]