为 lldb 中的大型数据结构设置观察点
Setting watchpoints for large data structures in lldb
我正在学习 lldb,我很好奇您如何为更大的数据结构(例如向量)设置观察点。我知道我可以使用 print 并且它有效,但我收到一条消息说不支持大小为 "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> >) = 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
如果您在 Mac 上,x86_64 架构允许 4 个独立的监视区域,每个区域最多 8 个字节。目前,lldb 只会为每个监视请求使用一个区域。它可以将多个监视区域组合在一起以处理适用于此结构的更大请求。欢迎使用 http://bugs.llvm.org 提交对此功能的增强请求。但是观察点是非常有限的资源,因此您通常必须非常有针对性地了解您要观察的内容 - 这可能就是为什么没有人愿意支持 > 8 字节的原因。
如果您想在元素添加到向量或从向量中删除时停止,观察向量中的结束指针就足够了(即 __end_
)。您可以使用 "frame var" 的 --raw
参数查看向量的实际内容:
(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 个字节供您使用,您不会在有意义大小的向量中观看所有数据。当然,当矢量调整大小时,您对旧数据的观察点现在将指向释放的内存...
我正在学习 lldb,我很好奇您如何为更大的数据结构(例如向量)设置观察点。我知道我可以使用 print 并且它有效,但我收到一条消息说不支持大小为 "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> >) = 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
如果您在 Mac 上,x86_64 架构允许 4 个独立的监视区域,每个区域最多 8 个字节。目前,lldb 只会为每个监视请求使用一个区域。它可以将多个监视区域组合在一起以处理适用于此结构的更大请求。欢迎使用 http://bugs.llvm.org 提交对此功能的增强请求。但是观察点是非常有限的资源,因此您通常必须非常有针对性地了解您要观察的内容 - 这可能就是为什么没有人愿意支持 > 8 字节的原因。
如果您想在元素添加到向量或从向量中删除时停止,观察向量中的结束指针就足够了(即 __end_
)。您可以使用 "frame var" 的 --raw
参数查看向量的实际内容:
(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 个字节供您使用,您不会在有意义大小的向量中观看所有数据。当然,当矢量调整大小时,您对旧数据的观察点现在将指向释放的内存...