Sanitizer 能够在单测、功

简介: q

可以将此文件 https://github.com/dataroaring/tools/blob/main/gdb/dbinit_stl_views-1.03.txt 放置到~/.gdbinit中使用 STL-View。STL-View 输出非常友好,支持 pvector,plist,plist_member,pmap,pmap_member,pset,pdequeue,pstack,pqueue,ppqueue,pbitset,pstring,pwstring。以 Apache Doris 中使用 pvector 为例,它能够输出 vector 中的所有元素。

(gdb) pvector block.data
elem[0]: $5 = {
column = {

<COW<doris::vectorized::IColumn>::intrusive_ptr<doris::vectorized::IColumn const>> = {
  t = 0x606000fdc820
}, <No data fields>},

type = {

<std::__shared_ptr<doris::vectorized::IDataType const, (__gnu_cxx::_Lock_policy)2>> = {
  <std::__shared_ptr_access<doris::vectorized::IDataType const, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>},
  members of std::__shared_ptr<doris::vectorized::IDataType const, (__gnu_cxx::_Lock_policy)2>:
  _M_ptr = 0x6030069e9780,
  _M_refcount = {
    _M_pi = 0x6030069e9770
  }
}, <No data fields>},

name = {

static npos = 18446744073709551615,
_M_dataplus = {
  <std::allocator<char>> = {
    <__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
  members of std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider:
  _M_p = 0x61400006e068 "n_nationkey"
},
_M_string_length = 11,
{
  _M_local_buf = "n_nationkey\000\276\276\276\276",
  _M_allocated_capacity = 7957695015158701934
}

}
}
elem[1]: $6 = {
column = {

<COW<doris::vectorized::IColumn>::intrusive_ptr<doris::vectorized::IColumn const>> = {
  t = 0x6080001ec220
}, <No data fields>},

type = {
...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Pretty-Printer
GCC 7.0 开始支持了 Pretty-Printer 打印 STL 容器,可以将以下代码放置到~/.gdbinit中使 Pretty-Printer 生效。

注意:/usr/share/gcc/python需要更换为本机对应的地址。

python
import sys
sys.path.insert(0, '/usr/share/gcc/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
1
2
3
4
5
6
以 vector 为例, Pretty-Printer 能够打印出详细内容。

(gdb) p block.data
$1 = std::vector of length 7, capacity 8 = {{

column = {
  <COW<doris::vectorized::IColumn>::intrusive_ptr<doris::vectorized::IColumn const>> = {
    t = 0x606000fdc820
  }, <No data fields>},
type = std::shared_ptr<const doris::vectorized::IDataType> (use count 1, weak count 0) = {
  get() = 0x6030069e9780
},
name = "n_nationkey"

}, {

column = {
  <COW<doris::vectorized::IColumn>::intrusive_ptr<doris::vectorized::IColumn const>> = {
    t = 0x6080001ec220
  }, <No data fields>},
type = std::shared_ptr<const doris::vectorized::IDataType> (use count 1, weak count 0) = {
  get() = 0x6030069e9750
},
name = "n_name"

}, {

column = {
  <COW<doris::vectorized::IColumn>::intrusive_ptr<doris::vectorized::IColumn const>> = {
    t = 0x606000fd52c0
  }, <No data fields>},
type = std::shared_ptr<const doris::vectorized::IDataType> (use count 1, weak count 0) = {
  get() = 0x6030069e9720
},
name = "n_regionkey"

}, {

column = {
  <COW<doris::vectorized::IColumn>::intrusive_ptr<doris::vectorized::IColumn const>> = {
    t = 0x6030069e96b0
  }, <No data fields>},
type = std::shared_ptr<const doris::vectorized::IDataType> (use count 1, weak count 0) = {
  get() = 0x604000a66160
},
name = "n_comment"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Boost Pretty Printer
因为 Apache Doris 使用 Boost 不多,因此不再举例。

可以参考:https://github.com/ruediger/Boost-Pretty-Printer

总结
有了 Sanitizer 能够在单测、功能、集成、压力测试环境及时发现问题,最重要的是大多数时候都可以给出程序出问题的关联现场,比如内存分配的调用栈,释放内存的调用栈,非法访问内存的调用栈,配合 Core Dump 可以查看现场状态,解决 C++ 内存问题从猜测变成了有证据的现场分析。

作者介绍:杨勇强,SelectDB 联合创始人兼产品VP,同时也是Apache Doris Committer。曾担任百度智能云存储部总架构师,主导构建了云存储技术产品体系,是Linux内核社区贡献者。

相关文章
|
3月前
|
IDE 测试技术 持续交付
单元测试功
【9月更文挑战第03天】
70 5
|
4月前
|
测试技术 芯片
飞针测试机在贴装线路板应用
【8月更文挑战第26天】飞针测试机在PCBA中的应用涵盖检测开路与短路、测试元件电气性能、检查元件安装正确性、识别缺失或损坏的元件,并适用于小批量和多品种生产,有助于提高产品质量和可靠性。它能提供详细故障信息,便于问题定位与反馈,但测试速度较慢,需根据生产规模和质量要求选择合适的测试设备。
|
4月前
|
分布式计算 算法 测试技术
史上最强代码自测方法,没有之一!
史上最强代码自测方法,没有之一!
|
敏捷开发 测试技术
测试思想-测试设计 精简测试用例编写
测试思想-测试设计 精简测试用例编写
101 0
|
测试技术
测试思想-测试执行 如何进行回归测试?
测试思想-测试执行 如何进行回归测试?
98 0
|
测试技术
测试思想-测试设计 测试用例设计之判定表驱动分析方法
测试思想-测试设计 测试用例设计之判定表驱动分析方法
123 0
|
敏捷开发 开发框架 前端开发
来聊聊我们为什么要写单测
哈喽,大家好,我是海怪。 最近在组里我又领了一个新任务:前端单元测试。 关于这个话题在很早的时候就想和大家聊了,奈何一直没机会。对于我个人来说,我是非常喜欢写单测的。最近还买了本《软件测试》的书,算是再次复习一下大学时学过的专业课,平时在捣鼓一些个人项目的时候也会做一些基础的单测。
来聊聊我们为什么要写单测
|
Web App开发 前端开发 测试技术
|
测试技术 数据库 数据安全/隐私保护
接口测试平台代码实现140: 项目大用例干扰bug解决
上节课我们明确了解决方案,先试验思路1, 也就是想办法 隔离。
接口测试平台代码实现140: 项目大用例干扰bug解决
|
安全 测试技术 数据库
接口测试平台代码实现141: 项目大用例干扰bug解决2
接口测试平台代码实现141: 项目大用例干扰bug解决2
接口测试平台代码实现141: 项目大用例干扰bug解决2