tricorder-observability / Starship

Starship: next-generation Observability platform built with eBPF+WASM
GNU Affero General Public License v3.0
163 stars 23 forks source link

【需求】bcc代码容器化部署适配 #115

Open zongjiangU opened 1 year ago

zongjiangU commented 1 year ago

这个功能需求是来解决什么问题?

现已开发了一个agent用于mysql server监控,从用户态的mysqld进行探测。

本地开发测试已经可以work

本地环境:

容器化部署后agent在attach_uprobe抛出异常 bpf: Argument list too long. Program too large (359 insns), at most 4096 insns

容器环境:

容器环境中在遍历attach_uprobe时,其他probe均正常,对函数dead_lock_checker_notify_entry进行attch会抛出上述异常,引发异常的ebpf函数代码块如下:

#define MAX_STACK_SIZE  16
int dead_lock_checker_notify_entry(struct pt_regs *ctx){
    u32 g_key = (u32)GLOBAL_CONFIG_KEY_DEAD_CHECKER;
    u64 start = 1;

    COM_GLOBAL_CONFIG_DATA *g_config = global_config.lookup(&g_key);
    if(g_config){
        delete_last_submit_key(g_config);
        u64 tmp = g_config->key1 + 1;
    }
    u64 end = start;

    // get stack size
    void *root =  (void*) PT_REGS_PARM1(ctx);
    u64 stack_size = 0;
    bpf_probe_read(&stack_size,sizeof(u64),GET_STACK_SIZE_FROM_DEAD_CHECKER_PTR(root));
    if(stack_size == 0) return 0;

    // get address of static var
    COM_STATS_T s_stats_item = {};
    void* start_ptr = (void*)STATIC_STATS_S_PTR;

    #pragma nounroll
    for(u32 i = 0; i < (stack_size & (MAX_STACK_SIZE - 1)); i++){
        if(i > 0) start_ptr += sizeof(COM_STATS_T_PTR);
        void *lock = GET_LOCK_PTR_FROM_STATS_PTR_DEADLOCK(start_ptr);
        void *wait_lock = GET_WAIT_LOCK_PTR_FROM_STATS_PTR_DEADLOCK(start_ptr);
        get_dead_lock_data_from_lock_ptr((void***)&lock,&s_stats_item.lock);
        get_dead_lock_data_from_lock_ptr((void***)&wait_lock,&s_stats_item.wait_lock);
        bpf_probe_read_user(&s_stats_item.heap_no,sizeof(u64),GET_HEAP_NO_PTR_FROM_STATS_PTR_DEADLOCK(start_ptr));
        dead_lock_checker_stack.insert(&end,&s_stats_item);
        end += 1;
    }
    if(g_config){
        bpf_probe_read_kernel(&g_config->key1,sizeof(u64),&start);
        bpf_probe_read_kernel(&g_config->key2,sizeof(u64),&end);
        global_config.update(&g_key,g_config);
    }
    else{
        COM_GLOBAL_CONFIG_DATA global_data = {};
        global_data.key1 = start;
        global_data.key2 = end;
        global_config.insert(&g_key,&global_data);
    }
    COM_DEAD_LOCK_EVENT event = {};
    event.type  = MYSQL_PROBE_TYPE_DEAD_LOCK_NOTIFY;
    event.start = start;
    event.end   = end;
    perf_events.perf_submit(ctx,&event,sizeof(event));
    return 0;
}

for循环中的get_dead_lock_data_from_lock_ptr方法内部调用了10次内联(用于地址偏移)和7次bpf辅助函数调用(bpf_probe_read_user)

是否在 Kubernetes 平台上 是 k8s 1.22

内核版本 4.18

是否考虑过其他解决方案 尝试过redhat ubi:8.6 : agent启动后会init多个ebpf程序 在init第一个ebpf时会出现头文件<asm/types.h>找不到 init失败进程不退出,继续进行第二个ebpf的init则会成功,且attch dead_lock_checker_notify_entry 也是正常的 整体功能只有第一个ebpf异常。 上述方式是以调测模式启动的pod,sleep住后进入容器内手动拉起 不以调测模式启动时,pod执行启动命令拉起agent时,pod无法启动,会抛出异常pure virtual method called terminate called without an active exception, 容器是cri-o捕获到第一个init异常直接kill掉了主进程。 用ubi:8.6是使用的clang-11

希望能在bcc程序跨主机的容器化部署方面得到帮助

nascentcore-eng commented 1 year ago

感谢提供线索!我们会尽快跟踪

nascentcore-eng commented 1 year ago

image

这个看上去有点问题,应该是

#pragma unroll

而不是 prgama nounroll

我明天试一下用 Starship 部署这个 BCC 代码看看是否可以复现

nascentcore-eng commented 1 year ago

@yunwei37 @ArthurChiao 你们看这个问题有什么线索吗?

zongjiangU commented 1 year ago

image

这个看上去有点问题,应该是

#pragma unroll

而不是 prgama nounroll

我明天试一下用 Starship 部署这个 BCC 代码看看是否可以复现

原本没有写这个#prgama nounroll的声明,在容器里抛异常bpf: Argument list too long. Program too large (359 insns), at most 4096 insns后加上了这个nounroll的声明,也没有解决指令过多的异常。

zongjiangU commented 1 year ago

almalinux8.6 容器环境 :

sh-4.4# uname -r
4.18.0-305.25.1.el8_4.x86_64
sh-4.4# rpm -qa|grep bcc
bcc-0.19.0-5.el8.x86_64
bcc-devel-0.19.0-5.el8.x86_64
bcc-tools-0.19.0-5.el8.x86_64
python3-bcc-0.19.0-5.el8.x86_64
sh-4.4# rpm -qa|grep clang
clang-libs-13.0.1-1.module_el8.6.0+2864+ffe288a1.x86_64
clang-resource-filesystem-13.0.1-1.module_el8.6.0+2864+ffe288a1.x86_64
sh-4.4# 

重定向输入空设备,libclang抛出异常

sh-4.4# /usr/local/bin/agent-start.sh < /dev/null
DraLog init
/host/proc/21300/exe: error while loading shared libraries: libprotobuf-lite.so.3.6.1: cannot open shared object file: No such file or directory
pure virtual method called
terminate called without an active exception
/usr/local/bin/agent-start.sh: line 3:  1080 Aborted                 (core dumped) ./dra_agent

gdb core

#0  0x00007ffff5538a9f in raise () from /lib64/libc.so.6
#1  0x00007ffff550be05 in abort () from /lib64/libc.so.6
#2  0x00007ffff5ed909b in __gnu_cxx::__verbose_terminate_handler() [clone .cold.1] () from /lib64/libstdc++.so.6
#3  0x00007ffff5edf53c in __cxxabiv1::__terminate(void (*)()) () from /lib64/libstdc++.so.6
#4  0x00007ffff5edf597 in std::terminate() () from /lib64/libstdc++.so.6
#5  0x00007ffff5ee03f5 in __cxa_pure_virtual () from /lib64/libstdc++.so.6
#6  0x00007ffff3eb0e5a in llvm::raw_ostream::tell (this=0x7ffff1891e60) at /usr/include/llvm/Support/raw_ostream.h:135
#7  clang::TextDiagnosticPrinter::HandleDiagnostic (this=0x7fffdc014330, Level=clang::DiagnosticsEngine::Warning, Info=...) at ../lib/Frontend/TextDiagnosticPrinter.cpp:126
#8  0x00007ffff23cd604 in clang::DiagnosticIDs::EmitDiag (this=<optimized out>, Diag=..., DiagLevel=clang::DiagnosticIDs::Warning) at ../lib/Basic/DiagnosticIDs.cpp:804
#9  0x00007ffff23ced20 in clang::DiagnosticIDs::ProcessDiag (this=this@entry=0x7fffddebd120, Diag=...) at ../lib/Basic/DiagnosticIDs.cpp:796
#10 0x00007ffff23c912b in clang::DiagnosticsEngine::ProcessDiag (this=0x7fffdd8d2c30) at ../include/clang/Basic/Diagnostic.h:1032
#11 clang::DiagnosticsEngine::EmitCurrentDiagnostic (this=0x7fffdd8d2c30, Force=<optimized out>) at ../lib/Basic/Diagnostic.cpp:532
#12 0x00007ffff23f83de in clang::DiagnosticBuilder::Emit (this=0x7fffe577e3b0) at ../include/clang/Basic/Diagnostic.h:1315
#13 clang::DiagnosticBuilder::Emit (this=0x7fffe577e3b0) at ../include/clang/Basic/Diagnostic.h:1309
#14 clang::DiagnosticBuilder::~DiagnosticBuilder (this=0x7fffe577e3b0, __in_chrg=<optimized out>) at ../include/clang/Basic/Diagnostic.h:1356
#15 0x00007ffff24cfa6d in clang::Preprocessor::HandleDefineDirective (this=0x7fffdd4b6d60, DefineTok=..., ImmediatelyAfterHeaderGuard=<optimized out>) at ../include/clang/Basic/Diagnostic.h:1428
#16 0x00007ffff24d06e4 in clang::Preprocessor::HandleDirective (this=0x7fffdd4b6d60, Result=...) at ../lib/Lex/PPDirectives.cpp:1100
#17 0x00007ffff2497a48 in clang::Lexer::LexTokenInternal (this=0x7fffdc467f30, Result=..., TokAtPhysicalStartOfLine=<optimized out>) at ../lib/Lex/Lexer.cpp:4009
#18 0x00007ffff2506b9f in clang::Preprocessor::Lex (this=0x7fffdd4b6d60, Result=...) at /usr/include/c++/8/bits/unique_ptr.h:345
#19 0x00007ffff25d87d3 in clang::Parser::TryConsumeToken (Expected=clang::tok::semi, this=0x7fffdc06d640) at ../include/clang/Parse/Parser.h:495
#20 clang::Parser::ExpectAndConsumeSemi (this=this@entry=0x7fffdc06d640, DiagID=DiagID@entry=1376) at ../lib/Parse/Parser.cpp:157
#21 0x00007ffff2531af3 in clang::Parser::ParseDeclGroup (this=0x7fffdc06d640, DS=..., Context=clang::DeclaratorContext::File, DeclEnd=0x7fffe577f380, FRI=<optimized out>) at ../lib/Parse/ParseDecl.cpp:2151
#22 0x00007ffff253253c in clang::Parser::ParseSimpleDeclaration (this=0x7fffdc06d640, Context=clang::DeclaratorContext::File, DeclEnd=..., Attrs=..., RequireSemi=<optimized out>, FRI=0x0, DeclSpecStart=0x0) at ../lib/Parse/ParseDecl.cpp:1808
#23 0x00007ffff25328ea in clang::Parser::ParseDeclaration (this=this@entry=0x7fffdc06d640, Context=Context@entry=clang::DeclaratorContext::File, DeclEnd=..., attrs=..., DeclSpecStart=DeclSpecStart@entry=0x0) at ../lib/Parse/ParseDecl.cpp:1741
#24 0x00007ffff25dca95 in clang::Parser::ParseExternalDeclaration (this=0x7fffdc06d640, attrs=..., DS=<optimized out>) at ../lib/Parse/Parser.cpp:930
#25 0x00007ffff25ddf78 in clang::Parser::ParseTopLevelDecl (this=this@entry=0x7fffdc06d640, Result=..., IsFirstDecl=IsFirstDecl@entry=false) at ../lib/Parse/Parser.cpp:720

#26 0x00007ffff250e181 in clang::ParseAST (S=..., PrintStats=<optimized out>, SkipFunctionBodies=<optimized out>) at ../lib/Parse/ParseAST.cpp:157
#27 0x00007ffff3e56841 in clang::FrontendAction::Execute (this=this@entry=0x7fffe577ffc0) at ../lib/Frontend/FrontendAction.cpp:951
#28 0x00007ffff3df22ab in clang::CompilerInstance::ExecuteAction (this=0x7fffe577fa00, Act=warning: RTTI symbol not found for class 'ebpf::BFrontendAction'
...) at ../lib/Frontend/CompilerInstance.cpp:974
#29 0x00007ffff7a26371 in ebpf::ClangLoader::do_compile(std::unique_ptr<llvm::Module, std::default_delete<llvm::Module> >*, ebpf::TableStorage&, bool, std::vector<char const*, std::allocator<char const*> > const&, std::vector<char const*, std::allocator<char const*> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ebpf::FuncSource&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::map<int, std::tuple<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, int, int, int, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::less<int>, std::allocator<std::pair<int const, std::tuple<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, int, int, int, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&) () from /lib64/libbcc.so.0
#30 0x00007ffff7a287ef in ebpf::ClangLoader::parse(std::unique_ptr<llvm::Module, std::default_delete<llvm::Module> >*, ebpf::TableStorage&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, char const**, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ebpf::FuncSource&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::map<int, std::tuple<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, int, int, int, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::less<int>, std::allocator<std::pair<int const, std::tuple<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, int, int, int, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&) () from /lib64/libbcc.so.0
#31 0x00007ffff79a504d in ebpf::BPFModule::load_cfile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, char const**, int) () from /lib64/libbcc.so.0
#32 0x00007ffff79ab182 in ebpf::BPFModule::load_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const**, int) () from /lib64/libbcc.so.0
#33 0x00007ffff7ae6fb0 in ebpf::BPF::init(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::vector<ebpf::USDT, std::allocator<ebpf::USDT> > const&) () from /lib64/libbcc.so.0
#34 0x00000000005149d4 in NetworkTraffic::collectNetworkTrafficLoop (this=0x7ed380 <NetworkTraffic::getInstance()::networkTraffic>) at /home/youzongjiang/gerrit/DBdoctor/dra-agent/src/ebpf/NetworkTraffic.cpp:75
#35 0x00000000004f312f in BPFTrigger::<lambda()>::operator()(void) const (__closure=0x86a0c8) at /home/youzongjiang/gerrit/DBdoctor/dra-agent/src/ebpf/BPFTrigger.cpp:16
#36 0x00000000004f3a26 in std::__invoke_impl<void, BPFTrigger::start()::<lambda()> >(std::__invoke_other, BPFTrigger::<lambda()> &&) (__f=...) at /usr/include/c++/8/bits/invoke.h:60
#37 0x00000000004f3744 in std::__invoke<BPFTrigger::start()::<lambda()> >(BPFTrigger::<lambda()> &&) (__fn=...) at /usr/include/c++/8/bits/invoke.h:95
#38 0x00000000004f56ea in std::thread::_Invoker<std::tuple<BPFTrigger::start()::<lambda()> > >::_M_invoke<0>(std::_Index_tuple<0>) (this=0x86a0c8) at /usr/include/c++/8/thread:244
#39 0x00000000004f568c in std::thread::_Invoker<std::tuple<BPFTrigger::start()::<lambda()> > >::operator()(void) (this=0x86a0c8) at /usr/include/c++/8/thread:253
#40 0x00000000004f545f in std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<BPFTrigger::start()::<lambda()> > >, void>::operator()(void) const (this=0x7fffe5781d90)
    at /usr/include/c++/8/future:1362

coredump对应代码

不使用重定向输入(第一次)

sh-4.4# /usr/local/bin/agent-start.sh
DraLog init
/host/proc/21300/exe: error while loading shared libraries: libprotobuf-lite.so.3.6.1: cannot open shared object file: No such file or directory
/host/proc/36090/exe: error while loading shared libraries: libprotobuf-lite.so.3.6.1: cannot open shared object file: No such file or directory
/host/proc/41829/exe: error while loading shared libraries: libprotobuf-lite.so.3.6.1: cannot open shared object file: No such file or directory
In file included from <built-in>:2:
In file included from /virtual/include/bcc/bpf.h:12:
In file included from include/linux/types.h:6:
In file included from include/uapi/linux/types.h:14:
In file included from include/uapi/linux/posix_types.h:5:
In file included from include/linux/stddef.h:5:
In file included from include/uapi/linux/stddef.h:2:
In file included from include/linux/compiler_types.h:78:
include/linux/compiler-clang.h:29:9: warning: '__no_sanitize_address' macro redefined [-Wmacro-redefined]
#define __no_sanitize_address
        ^
include/linux/compiler-gcc.h:339:9: note: previous definition is here
#define __no_sanitize_address __attribute__((no_sanitize_address))
        ^
1 warning generated.
In file included from <built-in>:2:
In file included from /virtual/include/bcc/bpf.h:12:
In file included from include/linux/types.h:6:
In file included from include/uapi/linux/types.h:14:
In file included from include/uapi/linux/posix_types.h:5:
In file included from include/linux/stddef.h:5:
In file included from include/uapi/linux/stddef.h:2:
In file included from include/linux/compiler_types.h:78:
include/linux/compiler-clang.h:29:9: warning: '__no_sanitize_address' macro redefined [-Wmacro-redefined]
#define __no_sanitize_address
        ^
include/linux/compiler-gcc.h:339:9: note: previous definition is here
#define __no_sanitize_address __attribute__((no_sanitize_address))
        ^
1 warning generated.
In file included from <built-in>:2:
In file included from /virtual/include/bcc/bpf.h:12:
In file included from /lib/modules/4.18.0-305.25.1.el8_4.x86_64/build/include/linux/types.h:6:
/lib/modules/4.18.0-305.25.1.el8_4.x86_64/build/include/uapi/linux/types.h:5:10: fatal error: 'asm/types.h' file not found
#include <asm/types.h>
         ^~~~~~~~~~~~~
1 error generated.
In file included from <built-in>:2:
In file included from /virtual/include/bcc/bpf.h:12:
In file included from include/linux/types.h:6:
In file included from include/uapi/linux/types.h:14:
In file included from include/uapi/linux/posix_types.h:5:
In file included from include/linux/stddef.h:5:
In file included from include/uapi/linux/stddef.h:2:
In file included from include/linux/compiler_types.h:78:
include/linux/compiler-clang.h:29:9: warning: '__no_sanitize_address' macro redefined [-Wmacro-redefined]
#define __no_sanitize_address
        ^
include/linux/compiler-gcc.h:339:9: note: previous definition is here
#define __no_sanitize_address __attribute__((no_sanitize_address))
        ^
1 warning generated.
bpf: Failed to load program: Permission denied
Unrecognized arg#0 type PTR
; int mysql_execute_command_entry(struct pt_regs *ctx){
0: (bf) r6 = r1
; u32 thread_id = bpf_get_current_pid_tgid();
1: (85) call bpf_get_current_pid_tgid#14
; u32 thread_id = bpf_get_current_pid_tgid();
2: (63) *(u32 *)(r10 -4) = r0
; COM_PERF_EVENT *event = bpf_map_lookup_elem((void *)bpf_pseudo_fd(1, -5), &thread_id);
3: (18) r1 = 0xffff9e93f72e8400
5: (bf) r2 = r10
; 
6: (07) r2 += -4
; COM_PERF_EVENT *event = bpf_map_lookup_elem((void *)bpf_pseudo_fd(1, -5), &thread_id);
7: (85) call bpf_map_lookup_elem#1
8: (bf) r7 = r0
; if(!event){
9: (15) if r7 == 0x0 goto pc+33
 R0=map_value(id=0,off=0,ks=4,vs=448,imm=0) R6=ctx(id=0,off=0,imm=0) R7_w=map_value(id=0,off=0,ks=4,vs=448,imm=0) R10=fp0 fp-8=mmmm????
; void **tmp = bpf_map_lookup_elem((void *)bpf_pseudo_fd(1, -1), &thread_id);
10: (18) r1 = 0xffff9e9568bee800
12: (bf) r2 = r10
13: (07) r2 += -4
; void **tmp = bpf_map_lookup_elem((void *)bpf_pseudo_fd(1, -1), &thread_id);
14: (85) call bpf_map_lookup_elem#1
invalid stack type R2 off=-4 access_size=8
processed 13 insns (limit 1000000) max_states_per_insn 0 total_states 1 peak_states 1 mark_read 1
In file included from <built-in>:2:
In file included from /virtual/include/bcc/bpf.h:12:
In file included from include/linux/types.h:6:
In file included from include/uapi/linux/types.h:14:
In file included from include/uapi/linux/posix_types.h:5:
In file included from include/linux/stddef.h:5:
In file included from include/uapi/linux/stddef.h:2:
In file included from include/linux/compiler_types.h:78:
include/linux/compiler-clang.h:29:9: warning: '__no_sanitize_address' macro redefined [-Wmacro-redefined]
#define __no_sanitize_address
        ^
include/linux/compiler-gcc.h:339:9: note: previous definition is here
#define __no_sanitize_address __attribute__((no_sanitize_address))
        ^
1 warning generated.

容器没有重启,继续执行启动脚本

sh-4.4# /usr/local/bin/agent-start.sh
DraLog init
/host/proc/21300/exe: error while loading shared libraries: libprotobuf-lite.so.3.6.1: cannot open shared object file: No such file or directory
/host/proc/36090/exe: error while loading shared libraries: libprotobuf-lite.so.3.6.1: cannot open shared object file: No such file or directory
/host/proc/41829/exe: error while loading shared libraries: libprotobuf-lite.so.3.6.1: cannot open shared object file: No such file or directory
In file included from <built-in>:2:
In file included from /virtual/include/bcc/bpf.h:12:
In file included from include/linux/types.h:6:
In file included from include/uapi/linux/types.h:14:
In file included from include/uapi/linux/posix_types.h:5:
In file included from include/linux/stddef.h:5:
In file included from include/uapi/linux/stddef.h:2:
In file included from include/linux/compiler_types.h:78:
include/linux/compiler-clang.h:29:9: warning: '__no_sanitize_address' macro redefined [-Wmacro-redefined]
#define __no_sanitize_address
        ^
include/linux/compiler-gcc.h:339:9: note: previous definition is here
#define __no_sanitize_address __attribute__((no_sanitize_address))
        ^
1 warning generated.
In file included from <built-in>:2:
In file included from /virtual/include/bcc/bpf.h:12:
In file included from include/linux/types.h:6:
In file included from include/uapi/linux/types.h:14:
In file included from include/uapi/linux/posix_types.h:5:
In file included from include/linux/stddef.h:5:
In file included from include/uapi/linux/stddef.h:2:
In file included from include/linux/compiler_types.h:78:
include/linux/compiler-clang.h:29:9: warning: '__no_sanitize_address' macro redefined [-Wmacro-redefined]
#define __no_sanitize_address
        ^
include/linux/compiler-gcc.h:339:9: note: previous definition is here
#define __no_sanitize_address __attribute__((no_sanitize_address))
        ^
1 warning generated.
...
In file included from <built-in>:2:
In file included from /virtual/include/bcc/bpf.h:12:
In file included from include/linux/types.h:6:
In file included from include/uapi/linux/types.h:14:
In file included from include/uapi/linux/posix_types.h:5:
In file included from include/linux/stddef.h:5:
In file included from include/uapi/linux/stddef.h:2:
In file included from include/linux/compiler_types.h:78:
include/linux/compiler-clang.h:29:9: warning: '__no_sanitize_address' macro redefined [-Wmacro-redefined]
#define __no_sanitize_address
        ^
#define __no_sanitize_address __attribute__((no_sanitize_address))
include/linux/compiler-gcc.h:339:9: note: previous definition is here
#define __no_sanitize_address __attribute__((no_sanitize_address))
        ^
1 warning generated.

相同的环境下两次启动进程整体表现不一致 同一个进程,bcc调用libclang来多次编译ebpf程序的表现也不一致(单个机器上)

zongjiangU commented 1 year ago

目前容器化部署bcc开发的agent已经可以正常运行了。

  1. 引起这些问题的最初原因是编译时无法找到asm/types.h 特权容器挂载/usr/src/kernel 、/lib/modules/$(uname -r) 也无法工作。怀疑是bcc、clang版本与宿主机内核不兼容,所以多次调整bcc版本以及yum安装多种clang版本。 当在整个agent内ebpf::BPF对象初始化前使用全局互斥量保证不存在并发后,此报错不再出现。 agent中对mysql的监控涉及了gdb以及分析mysqld的二进制文件,所以对多个mysql的bcc对象初始化做了互斥,避免cpu飙升的问题,但忽略了对内核网络栈监控的bcc对象存在与mysql-bcc对象并发的情况。
  2. 异常bpf: Argument list too long. Program too large (359 insns), at most 4096 insns 之前愚蠢的去yum安装clang,并不断的更换版本。但bcc是用的libclang去做的编译,并不是起了clang的子进程进行的编译,去掉clang的安装后,容器中只有bcc安装依赖的libclang,没有再出现insns报错。
  3. 重定向输入空设备,libclang抛出异常 pure virtual method called terminate called without an active exception 排查代码后发现整个进程由getchar()来做了个阻塞,在重定向输入空设备后,进程退出了,clang对象发生析构,bcc仍在异步编译ebpf,导致crash在了clang的编译过程中。

    能力有限,上述问题只是猜想,没有做源码上的验证,有不正确的地方希望大佬给指正。 如有验证思路,我也非常乐意参与验证,希望能在参与中更快的成长。

zongjiangU commented 1 year ago

这里有个小demo 在同时init多个BCC对象时会出现

/virtual/include/bcc/helpers.h:50:10: fatal error: 'uapi/linux/bpf.h' file not found
#include <uapi/linux/bpf.h>
         ^~~~~~~~~~~~~~~~~~
In file included from /virtual/main.c:4:
include/net/sock.h:64:10: fatal error: 'linux/filter.h' file not found
#include <linux/filter.h>
#include <string>
#include <vector>
#include <future>
#include <iostream>
#include <bcc/BPF.h>
#include <cstdint>
#include <thread>
std::string strBPFCode = R"(

#include <uapi/linux/ptrace.h>
#include <net/sock.h>
#include <bcc/proto.h>

struct ipv4_key_t {
    u32 pid;
    u16 type;
};

BPF_HASH(ipv4_map, struct ipv4_key_t,u64);

int kprobe__tcp_sendmsg(struct pt_regs *ctx, struct sock *sk,
    struct msghdr *msg, size_t size)
{
    /*获取当前进程的pid*/
    u32 pid = bpf_get_current_pid_tgid() >> 32;

    //FILTER_PID

    struct ipv4_key_t ipv4_key= {};
    ipv4_key.pid = pid;
    ipv4_key.type = 1;
    ipv4_map.increment(ipv4_key, size);
    return 0;
}
/*探测内核中的 tcp_cleanup_rbuf 函数 */
int kprobe__tcp_cleanup_rbuf(struct pt_regs *ctx, struct sock *sk, int copied)
{
    /*获取当前进程的pid*/
    u32 pid = bpf_get_current_pid_tgid() >> 32;

    //FILTER_PID

    u64 *val, zero =0;
    /*检错*/
    if (copied <= 0)
        return 0;
    struct ipv4_key_t ipv4_key = {};
    ipv4_key.pid = pid;
    ipv4_key.type = 2;
    ipv4_map.increment(ipv4_key, copied);
    return 0;
}
)";
struct ipv4_key_t {
    uint32_t pid;
    uint16_t type;
    size_t size;
};
void initBPF(){
    ebpf::BPF bpf;
    auto init_res = bpf.init(strBPFCode);
    if(!init_res.ok()) {
        std::cout << "init error"<<std::endl;
        return;
    }
    std::cout << "init OK" << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1000));
    auto attach_res = bpf.attach_kprobe("tcp_sendmsg", "kprobe__tcp_sendmsg");
    if(!attach_res.ok()) {
        std::cout <<"attach_kprobe tcp_sendmsg failed" << std::endl;
        return;
    }
    attach_res = bpf.attach_kprobe("tcp_cleanup_rbuf", "kprobe__tcp_cleanup_rbuf");
    if(!attach_res.ok()) {
        std::cout <<"attach_kprobe tcp_cleanup_rbuf failed"<<std::endl;
        return;
    }
    std::cout << "init success"<<std::endl;
    while (true){
        std::this_thread::sleep_for(std::chrono::seconds(1));
        auto ipv4_map = bpf.get_hash_table<ipv4_key_t, uint64_t>("ipv4_map");
        auto table = ipv4_map.get_table_offline();
        for (auto &item : table) {
            std::cout << item.first.pid<<std::endl;
        }
    }
}
int main(){
    std::future<void> tmp1 = std::async(initBPF);
    std::future<void> tmp2 = std::async(initBPF);
   /* std::future<void> tmp3 = std::async(initBPF);
    std::future<void> tmp4 = std::async(initBPF);
    std::future<void> tmp5 = std::async(initBPF);
    std::future<void> tmp6 = std::async(initBPF);
    std::future<void> tmp7 = std::async(initBPF);
    std::future<void> tmp8 = std::async(initBPF);
    std::future<void> tmp9 = std::async(initBPF);
    std::future<void> tmp10 = std::async(initBPF);
    std::future<void> tmp11 = std::async(initBPF);*/
    pause();
}
zongjiangU commented 1 year ago

clang -fsanitize=thread -lbcc -pthread -lstdc++ tt.cpp -o tt ./tt

==================
WARNING: ThreadSanitizer: data race (pid=560713)
  Atomic read of size 1 at 0x7b0c00012d20 by thread T1:
    #0 pthread_mutex_lock <null> (tt+0x47ada8)
    #1 llvm::TrackingStatistic::RegisterStatistic() <null> (libLLVM-13.so+0xa71055)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #4 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #6 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #7 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #8 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #9 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #10 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #11 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #13 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #14 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #15 pthread_once <null> (tt+0x4a3713)
    #16 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #17 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #18 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #19 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #20 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #21 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #22 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #23 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #24 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #25 <null> <null> (libstdc++.so.6+0xc2ba2)

  Previous write of size 8 at 0x7b0c00012d20 by thread T2 (mutexes: write M7):
    #0 malloc <null> (tt+0x49be9c)
    #1 operator new(unsigned long) <null> (libstdc++.so.6+0x96d6b)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #4 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #6 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #7 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #8 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #9 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #10 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #11 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #13 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #14 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #15 pthread_once <null> (tt+0x4a3713)
    #16 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #17 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #18 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #19 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #20 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #21 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #22 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #23 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #24 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #25 <null> <null> (libstdc++.so.6+0xc2ba2)

  Location is heap block of size 48 at 0x7b0c00012d20 allocated by thread T2:
    #0 malloc <null> (tt+0x49be9c)
    #1 operator new(unsigned long) <null> (libstdc++.so.6+0x96d6b)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #4 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #6 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #7 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #8 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #9 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #10 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #11 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #13 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #14 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #15 pthread_once <null> (tt+0x4a3713)
    #16 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #17 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #18 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #19 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #20 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #21 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #22 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #23 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #24 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #25 <null> <null> (libstdc++.so.6+0xc2ba2)

  Mutex M7 (0x7f46ceae8580) created at:
    #0 pthread_mutex_lock <null> (tt+0x47ada8)
    #1 llvm::ManagedStaticBase::RegisterManagedStatic(void* (*)(), void (*)(void*)) const <null> (libLLVM-13.so+0xa54687)

  Thread T1 (tid=560715, running) created by main thread at:
    #0 pthread_create <null> (tt+0x471f07)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xc2e88)
    #2 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffd91)
    #3 void __gnu_cxx::new_allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffc91)
    #4 void std::allocator_traits<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >&, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff8dd)
    #5 std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff3e7)
    #6 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*&, std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff0c8)
    #7 std::__shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fefb3)
    #8 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fef07)
    #9 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::allocate_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > const&, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fede9)
    #10 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::make_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fec92)
    #11 std::shared_ptr<std::__future_base::_State_baseV2> std::__future_base::_S_make_async_state<std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fe881)
    #12 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(std::launch, void (&)()) <null> (tt+0x4fe5d4)
    #13 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(void (&)()) <null> (tt+0x4f8b36)
    #14 main <null> (tt+0x4f783e)

  Thread T2 (tid=560716, running) created by main thread at:
    #0 pthread_create <null> (tt+0x471f07)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xc2e88)
    #2 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffd91)
    #3 void __gnu_cxx::new_allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffc91)
    #4 void std::allocator_traits<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >&, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff8dd)
    #5 std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff3e7)
    #6 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*&, std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff0c8)
    #7 std::__shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fefb3)
    #8 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fef07)
    #9 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::allocate_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > const&, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fede9)
    #10 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::make_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fec92)
    #11 std::shared_ptr<std::__future_base::_State_baseV2> std::__future_base::_S_make_async_state<std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fe881)
    #12 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(std::launch, void (&)()) <null> (tt+0x4fe5d4)
    #13 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(void (&)()) <null> (tt+0x4f8b36)
    #14 main <null> (tt+0x4f7851)

SUMMARY: ThreadSanitizer: data race (/home/youzongjiang/gerrit/DBdoctor/dra-agent/src/test/tt+0x47ada8) in __interceptor_pthread_mutex_lock
==================
==================
WARNING: ThreadSanitizer: data race (pid=560713)
  Read of size 8 at 0x7b08000088a0 by thread T1:
    #0 memcmp <null> (tt+0x4aa462)
    #1 std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, ebpf::TableDesc>, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, ebpf::TableDesc> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, ebpf::TableDesc> > >::find(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) <null> (libbcc.so.0+0x1118d7)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #4 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #6 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #7 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #8 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #9 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #10 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #11 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #13 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #14 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #15 pthread_once <null> (tt+0x4a3713)
    #16 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #17 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #18 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #19 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #20 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #21 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #22 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #23 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #24 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #25 <null> <null> (libstdc++.so.6+0xc2ba2)

  Previous write of size 8 at 0x7b08000088a0 by thread T2:
    #0 malloc <null> (tt+0x49be9c)
    #1 operator new(unsigned long) <null> (libstdc++.so.6+0x96d6b)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #4 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #6 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #7 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #8 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #9 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #10 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #11 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #13 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #14 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #15 pthread_once <null> (tt+0x4a3713)
    #16 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #17 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #18 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #19 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #20 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #21 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #22 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #23 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #24 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #25 <null> <null> (libstdc++.so.6+0xc2ba2)

  Location is heap block of size 26 at 0x7b08000088a0 allocated by thread T2:
    #0 malloc <null> (tt+0x49be9c)
    #1 operator new(unsigned long) <null> (libstdc++.so.6+0x96d6b)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #4 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #6 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #7 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #8 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #9 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #10 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #11 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #13 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #14 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #15 pthread_once <null> (tt+0x4a3713)
    #16 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #17 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #18 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #19 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #20 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #21 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #22 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #23 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #24 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #25 <null> <null> (libstdc++.so.6+0xc2ba2)

  Thread T1 (tid=560715, running) created by main thread at:
    #0 pthread_create <null> (tt+0x471f07)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xc2e88)
    #2 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffd91)
    #3 void __gnu_cxx::new_allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffc91)
    #4 void std::allocator_traits<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >&, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff8dd)
    #5 std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff3e7)
    #6 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*&, std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff0c8)
    #7 std::__shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fefb3)
    #8 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fef07)
    #9 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::allocate_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > const&, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fede9)
    #10 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::make_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fec92)
    #11 std::shared_ptr<std::__future_base::_State_baseV2> std::__future_base::_S_make_async_state<std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fe881)
    #12 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(std::launch, void (&)()) <null> (tt+0x4fe5d4)
    #13 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(void (&)()) <null> (tt+0x4f8b36)
    #14 main <null> (tt+0x4f783e)

  Thread T2 (tid=560716, running) created by main thread at:
    #0 pthread_create <null> (tt+0x471f07)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xc2e88)
    #2 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffd91)
    #3 void __gnu_cxx::new_allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffc91)
    #4 void std::allocator_traits<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >&, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff8dd)
    #5 std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff3e7)
    #6 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*&, std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff0c8)
    #7 std::__shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fefb3)
    #8 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fef07)
    #9 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::allocate_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > const&, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fede9)
    #10 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::make_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fec92)
    #11 std::shared_ptr<std::__future_base::_State_baseV2> std::__future_base::_S_make_async_state<std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fe881)
    #12 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(std::launch, void (&)()) <null> (tt+0x4fe5d4)
    #13 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(void (&)()) <null> (tt+0x4f8b36)
    #14 main <null> (tt+0x4f7851)

SUMMARY: ThreadSanitizer: data race (/home/youzongjiang/gerrit/DBdoctor/dra-agent/src/test/tt+0x4aa462) in __interceptor_memcmp
==================
==================
WARNING: ThreadSanitizer: data race (pid=560713)
  Read of size 8 at 0x7b08000088a8 by thread T1:
    #0 memcmp <null> (tt+0x4aa462)
    #1 std::_Rb_tree<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, ebpf::TableDesc>, std::_Select1st<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, ebpf::TableDesc> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, ebpf::TableDesc> > >::find(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) <null> (libbcc.so.0+0x1118d7)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #4 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #6 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #7 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #8 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #9 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #10 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #11 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #13 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #14 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #15 pthread_once <null> (tt+0x4a3713)
    #16 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #17 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #18 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #19 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #20 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #21 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #22 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #23 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #24 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #25 <null> <null> (libstdc++.so.6+0xc2ba2)

  Previous write of size 8 at 0x7b08000088a8 by thread T2:
    [failed to restore the stack]

  Location is heap block of size 26 at 0x7b08000088a0 allocated by thread T2:
    #0 malloc <null> (tt+0x49be9c)
    #1 operator new(unsigned long) <null> (libstdc++.so.6+0x96d6b)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #4 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #6 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #7 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #8 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #9 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #10 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #11 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #13 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #14 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #15 pthread_once <null> (tt+0x4a3713)
    #16 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #17 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #18 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #19 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #20 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #21 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #22 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #23 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #24 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #25 <null> <null> (libstdc++.so.6+0xc2ba2)

  Thread T1 (tid=560715, running) created by main thread at:
    #0 pthread_create <null> (tt+0x471f07)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xc2e88)
    #2 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffd91)
    #3 void __gnu_cxx::new_allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffc91)
    #4 void std::allocator_traits<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >&, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff8dd)
    #5 std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff3e7)
    #6 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*&, std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff0c8)
    #7 std::__shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fefb3)
    #8 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fef07)
    #9 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::allocate_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > const&, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fede9)
    #10 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::make_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fec92)
    #11 std::shared_ptr<std::__future_base::_State_baseV2> std::__future_base::_S_make_async_state<std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fe881)
    #12 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(std::launch, void (&)()) <null> (tt+0x4fe5d4)
    #13 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(void (&)()) <null> (tt+0x4f8b36)
    #14 main <null> (tt+0x4f783e)

  Thread T2 (tid=560716, running) created by main thread at:
    #0 pthread_create <null> (tt+0x471f07)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xc2e88)
    #2 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffd91)
    #3 void __gnu_cxx::new_allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffc91)
    #4 void std::allocator_traits<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >&, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff8dd)
    #5 std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff3e7)
    #6 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*&, std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff0c8)
    #7 std::__shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fefb3)
    #8 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fef07)
    #9 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::allocate_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > const&, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fede9)
    #10 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::make_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fec92)
    #11 std::shared_ptr<std::__future_base::_State_baseV2> std::__future_base::_S_make_async_state<std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fe881)
    #12 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(std::launch, void (&)()) <null> (tt+0x4fe5d4)
    #13 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(void (&)()) <null> (tt+0x4f8b36)
    #14 main <null> (tt+0x4f7851)

SUMMARY: ThreadSanitizer: data race (/home/youzongjiang/gerrit/DBdoctor/dra-agent/src/test/tt+0x4aa462) in __interceptor_memcmp
==================
==================
WARNING: ThreadSanitizer: data race (pid=560713)
  Write of size 8 at 0x7b18000086f0 by thread T1:
    #0 memset <null> (tt+0x4a39f7)
    #1 std::_Hashtable<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, unsigned long> >, std::__detail::_Select1st, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true, false, true> >::clear() <null> (libbcc.so.0+0x1345b4)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #4 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #6 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #7 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #8 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #9 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #10 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #11 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #13 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #14 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #15 pthread_once <null> (tt+0x4a3713)
    #16 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #17 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #18 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #19 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #20 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #21 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #22 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #23 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #24 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #25 <null> <null> (libstdc++.so.6+0xc2ba2)

  Previous write of size 8 at 0x7b18000086f0 by thread T2:
    [failed to restore the stack]

  Location is heap block of size 88 at 0x7b18000086a0 allocated by thread T2:
    #0 malloc <null> (tt+0x49be9c)
    #1 operator new(unsigned long) <null> (libstdc++.so.6+0x96d6b)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #4 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #6 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #7 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #8 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #9 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #10 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #11 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #13 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #14 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #15 pthread_once <null> (tt+0x4a3713)
    #16 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #17 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #18 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #19 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #20 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #21 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #22 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #23 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #24 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #25 <null> <null> (libstdc++.so.6+0xc2ba2)

  Thread T1 (tid=560715, running) created by main thread at:
    #0 pthread_create <null> (tt+0x471f07)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xc2e88)
    #2 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffd91)
    #3 void __gnu_cxx::new_allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffc91)
    #4 void std::allocator_traits<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >&, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff8dd)
    #5 std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff3e7)
    #6 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*&, std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff0c8)
    #7 std::__shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fefb3)
    #8 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fef07)
    #9 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::allocate_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > const&, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fede9)
    #10 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::make_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fec92)
    #11 std::shared_ptr<std::__future_base::_State_baseV2> std::__future_base::_S_make_async_state<std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fe881)
    #12 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(std::launch, void (&)()) <null> (tt+0x4fe5d4)
    #13 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(void (&)()) <null> (tt+0x4f8b36)
    #14 main <null> (tt+0x4f783e)

  Thread T2 (tid=560716, running) created by main thread at:
    #0 pthread_create <null> (tt+0x471f07)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xc2e88)
    #2 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffd91)
    #3 void __gnu_cxx::new_allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffc91)
    #4 void std::allocator_traits<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >&, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff8dd)
    #5 std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff3e7)
    #6 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*&, std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff0c8)
    #7 std::__shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fefb3)
    #8 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fef07)
    #9 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::allocate_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > const&, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fede9)
    #10 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::make_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fec92)
    #11 std::shared_ptr<std::__future_base::_State_baseV2> std::__future_base::_S_make_async_state<std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fe881)
    #12 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(std::launch, void (&)()) <null> (tt+0x4fe5d4)
    #13 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(void (&)()) <null> (tt+0x4f8b36)
    #14 main <null> (tt+0x4f7851)

SUMMARY: ThreadSanitizer: data race (/home/youzongjiang/gerrit/DBdoctor/dra-agent/src/test/tt+0x4a39f7) in __interceptor_memset
==================
==================
WARNING: ThreadSanitizer: data race (pid=560713)
  Read of size 8 at 0x7f46c255d010 by thread T1:
    #0 memcpy <null> (tt+0x4a3d83)
    #1 void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char*>(char*, char*, std::forward_iterator_tag) <null> (libbcc.so.0+0xfe863)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #4 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #6 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #7 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #8 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #9 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #10 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #11 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #13 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #14 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #15 pthread_once <null> (tt+0x4a3713)
    #16 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #17 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #18 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #19 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #20 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #21 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #22 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #23 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #24 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #25 <null> <null> (libstdc++.so.6+0xc2ba2)

  Previous write of size 8 at 0x7f46c255d010 by thread T2:
    #0 malloc <null> (tt+0x49be9c)
    #1 operator new(unsigned long) <null> (libstdc++.so.6+0x96d6b)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #4 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #6 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #7 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #8 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #9 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #10 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #11 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #13 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #14 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #15 pthread_once <null> (tt+0x4a3713)
    #16 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #17 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #18 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #19 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #20 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #21 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #22 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #23 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #24 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #25 <null> <null> (libstdc++.so.6+0xc2ba2)

  Location is heap block of size 1179648 at 0x7f46c255d000 allocated by thread T2:
    #0 malloc <null> (tt+0x49be9c)
    #1 operator new(unsigned long) <null> (libstdc++.so.6+0x96d6b)
    #2 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #3 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #4 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #5 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #6 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #7 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #8 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #9 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #10 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #11 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #12 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #13 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #14 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #15 pthread_once <null> (tt+0x4a3713)
    #16 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #17 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #18 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #19 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #20 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #21 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #22 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #23 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #24 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #25 <null> <null> (libstdc++.so.6+0xc2ba2)

  Thread T1 (tid=560715, running) created by main thread at:
    #0 pthread_create <null> (tt+0x471f07)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xc2e88)
    #2 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffd91)
    #3 void __gnu_cxx::new_allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffc91)
    #4 void std::allocator_traits<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >&, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff8dd)
    #5 std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff3e7)
    #6 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*&, std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff0c8)
    #7 std::__shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fefb3)
    #8 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fef07)
    #9 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::allocate_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > const&, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fede9)
    #10 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::make_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fec92)
    #11 std::shared_ptr<std::__future_base::_State_baseV2> std::__future_base::_S_make_async_state<std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fe881)
    #12 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(std::launch, void (&)()) <null> (tt+0x4fe5d4)
    #13 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(void (&)()) <null> (tt+0x4f8b36)
    #14 main <null> (tt+0x4f783e)

  Thread T2 (tid=560716, running) created by main thread at:
    #0 pthread_create <null> (tt+0x471f07)
    #1 std::thread::_M_start_thread(std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> >, void (*)()) <null> (libstdc++.so.6+0xc2e88)
    #2 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffd91)
    #3 void __gnu_cxx::new_allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ffc91)
    #4 void std::allocator_traits<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >::construct<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >&, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff8dd)
    #5 std::_Sp_counted_ptr_inplace<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, (__gnu_cxx::_Lock_policy)2>::_Sp_counted_ptr_inplace<std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff3e7)
    #6 std::__shared_count<(__gnu_cxx::_Lock_policy)2>::__shared_count<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>*&, std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4ff0c8)
    #7 std::__shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, (__gnu_cxx::_Lock_policy)2>::__shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fefb3)
    #8 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >::shared_ptr<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::_Sp_alloc_shared_tag<std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > >, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fef07)
    #9 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::allocate_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> >, std::thread::_Invoker<std::tuple<void (*)()> > >(std::allocator<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > const&, std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fede9)
    #10 std::shared_ptr<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void> > std::make_shared<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>, std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fec92)
    #11 std::shared_ptr<std::__future_base::_State_baseV2> std::__future_base::_S_make_async_state<std::thread::_Invoker<std::tuple<void (*)()> > >(std::thread::_Invoker<std::tuple<void (*)()> >&&) <null> (tt+0x4fe881)
    #12 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(std::launch, void (&)()) <null> (tt+0x4fe5d4)
    #13 std::future<std::result_of<std::decay<void (&)()>::type ()>::type> std::async<void (&)()>(void (&)()) <null> (tt+0x4f8b36)
    #14 main <null> (tt+0x4f7851)

SUMMARY: ThreadSanitizer: data race (/home/youzongjiang/gerrit/DBdoctor/dra-agent/src/test/tt+0x4a3d83) in __interceptor_memcpy
==================
ThreadSanitizer:DEADLYSIGNAL
==560713==ERROR: ThreadSanitizer: SEGV on unknown address 0x7f46c255d012 (pc 0x7f46d277fe52 bp 0x00000000000a sp 0x7f46c5dbb3f8 T560715)
==560713==The signal is caused by a READ memory access.
    #0 __memmove_sse2_unaligned_erms <null> (libc.so.6+0x36e52)
    #1 __interceptor_memcpy <null> (tt+0x4a3db6)
    #2 void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char*>(char*, char*, std::forward_iterator_tag) <null> (libbcc.so.0+0xfe863)
    #3 KSyms::resolve_name(char const*, char const*, unsigned long*) <null> (libbcc.so.0+0x12fba3)
    #4 bcc_symcache_resolve_name <null> (libbcc.so.0+0x12ebfd)
    #5 ebpf::BFrontendAction::DoMiscWorkAround() <null> (libbcc.so.0+0x1817cc)
    #6 ebpf::BFrontendAction::EndSourceFileAction() <null> (libbcc.so.0+0x1876ff)
    #7 clang::FrontendAction::EndSourceFile() <null> (libclang-cpp.so.13+0x2562d7d)
    #8 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) <null> (libclang-cpp.so.13+0x24ff307)
    #9 ebpf::ClangLoader::do_compile(std::unique_ptr<llvm::Module, std::default_delete<llvm::Module> >*, ebpf::TableStorage&, bool, std::vector<char const*, std::allocator<char const*> > const&, std::vector<char const*, std::allocator<char const*> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ebpf::FuncSource&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::map<int, std::tuple<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, int, int, int, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::less<int>, std::allocator<std::pair<int const, std::tuple<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, int, int, int, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&) <null> (libbcc.so.0+0x178370)
    #10 ebpf::ClangLoader::parse(std::unique_ptr<llvm::Module, std::default_delete<llvm::Module> >*, ebpf::TableStorage&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, char const**, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, ebpf::FuncSource&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::map<int, std::tuple<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, int, int, int, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::less<int>, std::allocator<std::pair<int const, std::tuple<int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, int, int, int, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >&, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >&) <null> (libbcc.so.0+0x17a7ee)
    #11 ebpf::BPFModule::load_cfile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool, char const**, int) <null> (libbcc.so.0+0xf704c)
    #12 ebpf::BPFModule::load_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const**, int) <null> (libbcc.so.0+0xfd181)
    #13 ebpf::BPF::init(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::vector<ebpf::USDT, std::allocator<ebpf::USDT> > const&) <null> (libbcc.so.0+0x238faf)
    #14 initBPF() <null> (tt+0x4f7015)
    #15 void std::__invoke_impl<void, void (*)()>(std::__invoke_other, void (*&&)()) <null> (tt+0x50338a)
    #16 std::__invoke_result<void (*)()>::type std::__invoke<void (*)()>(void (*&&)()) <null> (tt+0x5032cd)
    #17 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<void (*)()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x503275)
    #18 std::thread::_Invoker<std::tuple<void (*)()> >::operator()() <null> (tt+0x5030e5)
    #19 std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void>::operator()() const <null> (tt+0x502f3a)
    #20 std::_Function_handler<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> (), std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<void (*)()> >, void> >::_M_invoke(std::_Any_data const&) <null> (tt+0x502cbb)
    #21 std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>::operator()() const <null> (tt+0x50295b)
    #22 std::__future_base::_State_baseV2::_M_do_set(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*) <null> (tt+0x502459)
    #23 void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5028bd)
    #24 std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x502704)
    #25 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda'()::operator()() const <null> (tt+0x502653)
    #26 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::operator()() const <null> (tt+0x502585)
    #27 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&)::'lambda0'()::__invoke() <null> (tt+0x502515)
    #28 __interceptor_pthread_once <null> (tt+0x4a3713)
    #29 __gthread_once(int*, void (*)()) tt.cpp (tt+0x4f7a93)
    #30 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) <null> (tt+0x5023c4)
    #31 std::__future_base::_State_baseV2::_M_set_result(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>, bool) <null> (tt+0x501cbd)
    #32 std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()::operator()() const <null> (tt+0x501a76)
    #33 void std::__invoke_impl<void, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__invoke_other, std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x5019bd)
    #34 std::__invoke_result<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>::type std::__invoke<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()>(std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()&&) <null> (tt+0x50190d)
    #35 decltype(std::__invoke(_S_declval<0ul>())) std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::_M_invoke<0ul>(std::_Index_tuple<0ul>) <null> (tt+0x5018b5)
    #36 std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> >::operator()() <null> (tt+0x501855)
    #37 std::thread::_State_impl<std::thread::_Invoker<std::tuple<std::__future_base::_Async_state_impl<std::thread::_Invoker<std::tuple<void (*)()> >, void>::_Async_state_impl(std::thread::_Invoker<std::tuple<void (*)()> >&&)::'lambda'()> > >::_M_run() <null> (tt+0x501699)
    #38 <null> <null> (libstdc++.so.6+0xc2ba2)
    #39 __tsan_thread_start_func <null> (tt+0x46ec0f)
    #40 start_thread <null> (libpthread.so.0+0x81ce)
    #41 clone <null> (libc.so.6+0x39d82)

ThreadSanitizer can not provide additional info.
SUMMARY: ThreadSanitizer: SEGV (/lib64/libc.so.6+0x36e52) in __memmove_sse2_unaligned_erms
==560713==ABORTING
nascentcore-eng commented 1 year ago

目前容器化部署bcc开发的agent已经可以正常运行了。

  1. 引起这些问题的最初原因是编译时无法找到asm/types.h 特权容器挂载/usr/src/kernel 、/lib/modules/$(uname -r) 也无法工作。怀疑是bcc、clang版本与宿主机内核不兼容,所以多次调整bcc版本以及yum安装多种clang版本。 当在整个agent内ebpf::BPF对象初始化前使用全局互斥量保证不存在并发后,此报错不再出现。 agent中对mysql的监控涉及了gdb以及分析mysqld的二进制文件,所以对多个mysql的bcc对象初始化做了互斥,避免cpu飙升的问题,但忽略了对内核网络栈监控的bcc对象存在与mysql-bcc对象并发的情况。

这里的 kernel headers 在 Starship 里有一套多 kernel version linux headers 动态安装的功能 这个可以帮助到你们

我最近没有安排时间来复现这个问题,但是基本上我看可以考虑移植这个功能到你们 bcc agent,这个之后确认了能解决你们的问题之后可以再聊

zongjiangU commented 1 year ago

BCC在mysqld端的应用 性能测评

测试环境:

函数原型:

所要探测的函数选用了mysql-server层的命令分发处理函数bool dispatch_command(THD *thd, const COM_DATA *com_data,enum enum_server_command command) 所探测函数原型如下:

bool dispatch_command(THD *thd, const COM_DATA *com_data,
                      enum enum_server_command command)
{
  bool error= 0;
  Global_THD_manager *thd_manager= Global_THD_manager::get_instance();
  DBUG_ENTER("dispatch_command");
  DBUG_PRINT("info", ("command: %d", command));

  /* SHOW PROFILE instrumentation, begin */
#if defined(ENABLED_PROFILING)
  thd->profiling.start_new_query();
#endif

  /* DTRACE instrumentation, begin */
  MYSQL_COMMAND_START(thd->thread_id(), command,
                      (char *) thd->security_context()->priv_user().str,
                      (char *) thd->security_context()->host_or_ip().str);
  ...
    /* DTRACE instrumentation, end */
  if (MYSQL_QUERY_DONE_ENABLED() && command == COM_QUERY)
  {
    MYSQL_QUERY_DONE(thd->is_error());
  }
  if (MYSQL_COMMAND_DONE_ENABLED())
  {
    MYSQL_COMMAND_DONE(thd->is_error());
  }

  /* SHOW PROFILE instrumentation, end */
#if defined(ENABLED_PROFILING)
  thd->profiling.finish_current_query();
#endif

  DBUG_RETURN(error);
}

客户端的sql请求均经过此函数分发至下游的解析器、优化器及存储引擎,对该函数添加hook,可实现简略版的mysql审计功能。

BCC工具:

使用BCC开发一个工具对上述函数的入口及返回添加hook.(demo偷懒使用了python client...) demo中通过探测该函数获取线程id、sql执行耗时(ns)、用户名、host、ip、sql及sql size.

注:受限于ebpf数据结构大小限制,sql可能存在截断的情况,demo中未对截断的sql进行处理.

对于参数中的数据获取,demo中用了两种方法:

demo.py

#!/usr/bin/python

from __future__ import print_function
from bcc import BPF
import argparse
import ctypes as ct
import sys,time
import subprocess

# define BPF program
bpf_text = """
#include <uapi/linux/ptrace.h>
/**************************mysql struct def start*****************************/
enum enum_server_command
{
    COM_SLEEP,
    COM_QUIT,
    COM_INIT_DB,
    COM_QUERY,
    COM_FIELD_LIST,
    COM_CREATE_DB,
    COM_DROP_DB,
    COM_REFRESH,
    COM_SHUTDOWN,
    COM_STATISTICS,
    COM_PROCESS_INFO,
    COM_CONNECT,
    COM_PROCESS_KILL,
    COM_DEBUG,
    COM_PING,
    COM_TIME,
    COM_DELAYED_INSERT,
    COM_CHANGE_USER,
    COM_BINLOG_DUMP,
    COM_TABLE_DUMP,
    COM_CONNECT_OUT,
    COM_REGISTER_SLAVE,
    COM_STMT_PREPARE,
    COM_STMT_EXECUTE,
    COM_STMT_SEND_LONG_DATA,
    COM_STMT_CLOSE,
    COM_STMT_RESET,
    COM_SET_OPTION,
    COM_STMT_FETCH,
    COM_DAEMON,
    COM_BINLOG_DUMP_GTID,
    COM_RESET_CONNECTION,
    /* don't forget to update const char *command_name[] in sql_parse.cc */
    /* Must be last */
    COM_END
};

typedef struct st_com_init_db_data
{
    const char *db_name;
    unsigned long length;
} COM_INIT_DB_DATA;

#define MYSQL_SHUTDOWN_KILLABLE_CONNECT    (unsigned char)(1 << 0)
#define MYSQL_SHUTDOWN_KILLABLE_TRANS      (unsigned char)(1 << 1)
#define MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE (unsigned char)(1 << 2)
#define MYSQL_SHUTDOWN_KILLABLE_UPDATE     (unsigned char)(1 << 3)

#define LOCK_MODE_MASK  0xFUL
#define LOCK_TYPE_MASK    0xF0UL

enum mysql_enum_shutdown_level {
    SHUTDOWN_DEFAULT = 0,
    SHUTDOWN_WAIT_CONNECTIONS= MYSQL_SHUTDOWN_KILLABLE_CONNECT,
    SHUTDOWN_WAIT_TRANSACTIONS= MYSQL_SHUTDOWN_KILLABLE_TRANS,
    SHUTDOWN_WAIT_UPDATES= MYSQL_SHUTDOWN_KILLABLE_UPDATE,
    SHUTDOWN_WAIT_ALL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1),
    SHUTDOWN_WAIT_CRITICAL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1) + 1,
    KILL_QUERY= 254,
    KILL_CONNECTION= 255
};

typedef struct st_com_refresh_data
{
    unsigned char options;
} COM_REFRESH_DATA;

typedef struct st_com_shutdown_data
{
    enum mysql_enum_shutdown_level level;
} COM_SHUTDOWN_DATA;

typedef struct st_com_kill_data
{
    unsigned long id;
} COM_KILL_DATA;

typedef struct st_com_set_option_data
{
    unsigned int opt_command;
} COM_SET_OPTION_DATA;

typedef struct st_com_stmt_execute_data
{
    unsigned long stmt_id;
    unsigned long flags;
    unsigned char *params;
    unsigned long params_length;
} COM_STMT_EXECUTE_DATA;

typedef struct st_com_stmt_fetch_data
{
    unsigned long stmt_id;
    unsigned long num_rows;
} COM_STMT_FETCH_DATA;

typedef struct st_com_stmt_send_long_data_data
{
    unsigned long stmt_id;
    unsigned int  param_number;
    unsigned char *longdata;
    unsigned long length;
} COM_STMT_SEND_LONG_DATA_DATA;

typedef struct st_com_stmt_prepare_data
{
    const char *query;
    unsigned int length;
} COM_STMT_PREPARE_DATA;

typedef struct st_stmt_close_data
{
    unsigned int stmt_id;
} COM_STMT_CLOSE_DATA;

typedef struct st_com_stmt_reset_data
{
    unsigned int stmt_id;
} COM_STMT_RESET_DATA;

typedef struct st_com_query_data
{
    const char *query;
    unsigned int length;
} COM_QUERY_DATA;

typedef struct st_com_field_list_data
{
    unsigned char   *table_name;
    unsigned int    table_name_length;
    const unsigned char *query;
    unsigned int        query_length;
} COM_FIELD_LIST_DATA;

union COM_DATA {

    COM_INIT_DB_DATA com_init_db;
    COM_REFRESH_DATA com_refresh;
    COM_SHUTDOWN_DATA com_shutdown;
    COM_KILL_DATA com_kill;
    COM_SET_OPTION_DATA com_set_option;
    COM_STMT_EXECUTE_DATA com_stmt_execute;
    COM_STMT_FETCH_DATA com_stmt_fetch;
    COM_STMT_SEND_LONG_DATA_DATA com_stmt_send_long_data;
    COM_STMT_PREPARE_DATA com_stmt_prepare;
    COM_STMT_CLOSE_DATA com_stmt_close;
    COM_STMT_RESET_DATA com_stmt_reset;
    COM_QUERY_DATA com_query;
    COM_FIELD_LIST_DATA com_field_list;
};

struct String {
    char *m_ptr;
    size_t m_length;
    void *m_charset;
    u32 m_alloced_length;
    bool m_is_alloced;
};
/**************************mysql struct def end*****************************/

typedef struct perf_event{
    u32 tid;
    u32 size;
    u64 ts;
    char user[16];
    char ip[16];
    char host[24]; 
    char sql[256];
}COM_PERF_EVENT;

BPF_HASH(tid_dispatch_map, u32, COM_PERF_EVENT);

BPF_PERF_OUTPUT(events);

static inline void*   GET_SC_CTX_PTR_FROM_THD_PTR(void* thd)                    {return *(void**)(thd + 0x1198);}
static inline void*   GET_USER_PTR_FROM_SC_CTX_PTR(void* thd)                   {return thd + 0xa0;}
static inline void*   GET_HOST_PTR_FROM_SC_CTX_PTR(void* thd)                   {return thd + 0x20;}
static inline void*   GET_IP_PTR_FROM_SC_CTX_PTR(void* thd)                     {return thd + 0x40;}

int dispatch_command_entry(struct pt_regs *ctx) {

    enum  enum_server_command command_id = PT_REGS_PARM3(ctx);
    if (command_id != COM_QUERY) return 0;

    COM_PERF_EVENT event = {};
    event.tid = bpf_get_current_pid_tgid();

    union COM_DATA *com_data = (union COM_DATA *)PT_REGS_PARM2(ctx);
    event.size = com_data->com_query.length;
    bpf_probe_read_str(&event.sql, sizeof(event.sql), com_data->com_query.query);

    void *thd = (void*) PT_REGS_PARM1(ctx);

    void *sc_ctx = GET_SC_CTX_PTR_FROM_THD_PTR(thd);
    //user
    char *user = GET_USER_PTR_FROM_SC_CTX_PTR(sc_ctx);
    bpf_probe_read_str(&event.user, sizeof(event.user), user);
    //host
    struct String *host = (struct String *)GET_HOST_PTR_FROM_SC_CTX_PTR(sc_ctx);
    bpf_probe_read_str(&event.host, sizeof(event.host), host->m_ptr);
    //ip
    struct String *ip = (struct String *)GET_IP_PTR_FROM_SC_CTX_PTR(sc_ctx);
    bpf_probe_read_str(&event.ip, sizeof(event.ip), ip->m_ptr);

    event.ts = bpf_ktime_get_ns();

    //record dispatch
    tid_dispatch_map.insert(&event.tid,&event);

    return 0;
}

int dispatch_command_return(struct pt_regs *ctx) {
    u32 thread_id = bpf_get_current_pid_tgid();
    COM_PERF_EVENT *event = tid_dispatch_map.lookup(&thread_id);
    if (!event) return 0;
    event->ts = bpf_ktime_get_ns() - event->ts;
    events.perf_submit(ctx, event, sizeof(*event));
    tid_dispatch_map.delete(&thread_id);
    return 0;
}
"""

# initialize BPF
b = BPF(text=bpf_text)
b.attach_uprobe(name="/home/mysqld",  sym="_Z16dispatch_commandP3THDPK8COM_DATA19enum_server_command",fn_name='dispatch_command_entry')
b.attach_uretprobe(name="/home/mysqld",  sym="_Z16dispatch_commandP3THDPK8COM_DATA19enum_server_command",fn_name='dispatch_command_return')
def print_event(cpu, data, size):
    event = b["events"].event(data)
    print("%s %s %s %s %s %s %s" % (event.tid, event.ts, event.user, event.host, event.ip, event.sql, event.size))
b["events"].open_perf_buffer(print_event)
print("thread_id    time(ns)    user      host      ip       sql               sql_size")
while 1:
    try:
        b.perf_buffer_poll()
    except KeyboardInterrupt:
        exit()

执行探测工具python demo.py,连接mysql执行QUERY命令后获取数据如下:

[root@localhost doc]# python mysql.py
thread_id    time(ns)    user      host      ip       sql               sql_size
14704 677838 b'skip-grants use' b'localhost' b'127.0.0.1' b'select @@version_comment limit 1' 32
14704 464399 b'skip-grants use' b'localhost' b'127.0.0.1' b'SELECT DATABASE()' 17
14704 1882739 b'skip-grants use' b'localhost' b'127.0.0.1' b'show databases' 14
14704 475563 b'skip-grants use' b'localhost' b'127.0.0.1' b'show tables' 11
14704 1083073 b'skip-grants use' b'localhost' b'127.0.0.1' b'show tables' 11
14704 1083830 b'skip-grants use' b'localhost' b'127.0.0.1' b'select * from pi_dra_config' 27
14704 31102707 b'skip-grants use' b'localhost' b'127.0.0.1' b'update pi_dra_config set cfg_key = "test" where id = 1' 54

压测

使用sysbench进行读写压测,对比开启探测工具与不开启的情况,执行压测前清除mysql缓存,执行命令reset query cache; 压测命令:sysbench --mysql-user=root --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-password=Root2017# --events=400000 /usr/share/sysbench/oltp_read_write.lua --tables=10 --table_size=100000 --threads=80 run

开启探测工具数据如下:

sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 80
Initializing random number generator from current time

Initializing worker threads...

Threads started!

SQL statistics:
    queries performed:
        read:                            97496
        write:                           27856
        other:                           13928
        total:                           139280
    transactions:                        6964   (672.98 per sec.)
    queries:                             139280 (13459.70 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          10.3452s
    total number of events:              6964

Latency (ms):
         min:                                   25.36
         avg:                                  116.06
         max:                                  588.68
         95th percentile:                      297.92
         sum:                               808226.74

Threads fairness:
    events (avg/stddev):           87.0500/3.11
    execution time (avg/stddev):   10.1028/0.12

关闭探测工具数据如下:

sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 80
Initializing random number generator from current time

Initializing worker threads...

Threads started!

SQL statistics:
    queries performed:
        read:                            102480
        write:                           29280
        other:                           14640
        total:                           146400
    transactions:                        7320   (702.81 per sec.)
    queries:                             146400 (14056.17 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          10.4121s
    total number of events:              7320

Latency (ms):
         min:                                   21.88
         avg:                                  111.83
         max:                                  673.60
         95th percentile:                      331.91
         sum:                               818594.04

Threads fairness:
    events (avg/stddev):           91.5000/2.96
    execution time (avg/stddev):   10.2324/0.06

平均时延对比 开启/关闭:116.06ms/111.83ms 性能下降3.7%

附:在centos7.6 -- 3.x的内核中测试表现一致

小结