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内核社区贡献者。

相关文章
|
1月前
|
IDE 测试技术 持续交付
单元测试功
【9月更文挑战第03天】
33 5
|
3月前
|
存储 Java
软件开发常用之SpringBoot文件上传接口编写(中),一本书,代码大全(里面有很多代码重构的方法),屎山代码的原因是不断追加逻辑,在错误代码上堆积新的功能,在写完逻辑之后去思考一下,逻辑合理不
软件开发常用之SpringBoot文件上传接口编写(中),一本书,代码大全(里面有很多代码重构的方法),屎山代码的原因是不断追加逻辑,在错误代码上堆积新的功能,在写完逻辑之后去思考一下,逻辑合理不
|
敏捷开发 开发框架 前端开发
来聊聊我们为什么要写单测
哈喽,大家好,我是海怪。 最近在组里我又领了一个新任务:前端单元测试。 关于这个话题在很早的时候就想和大家聊了,奈何一直没机会。对于我个人来说,我是非常喜欢写单测的。最近还买了本《软件测试》的书,算是再次复习一下大学时学过的专业课,平时在捣鼓一些个人项目的时候也会做一些基础的单测。
来聊聊我们为什么要写单测
|
前端开发 JavaScript 测试技术
前端单测,我们应该测什么?
哈喽,大家好,我是海怪。 相信很多前端开发在写单测的时候,最大的问题就是:“我应该测什么东西?” 没错,解决问题不是最难的,发现问题才是!知道要测哪个远比怎么测重要很多! 今天看了 Kent 博客的 《How to know what to test》 的这篇博客,感觉醍醐灌顶,今天就把这篇博文也分享给大家。
前端单测,我们应该测什么?
|
前端开发 测试技术 API
前端单测,为什么不要测 “实现细节”?
哈喽,大家好,我是海怪。 相信不少同学在写单测的时候,最大的困扰不是如何写测试代码,而是:“应该测什么?”,“要测多深入”,“哪些不该测”。 最近在给 React 组件写单测的时候,发现了 Kent (React Testing Library 的贡献者之一)的 《Testing Implementation Details》 这篇文章,里面对 “为什么不要测代码实现细节?” 这个问题写得非常好,今天就把这篇文章也分享给大家。
前端单测,为什么不要测 “实现细节”?
|
缓存 测试技术 编译器
防御性编码和单元测试规则
捕捉错误、问题和缺陷的最佳位置是在开发周期的早期。图 1 展示了最容易出现缺陷的地方,以及最容易发现它们的地方,并包括了修复这些缺陷的成本(这些成本是针对 1996 年的 —— 今天的成本显然更高)。
1237 0
|
测试技术 Android开发 数据库