学习让我快乐

争于世, 不争于势;简洁, 高效, 赏心悦目

递归锁并不递归

日常测试时遇到了一个死锁堆栈, 堆栈很明确, 就是异常机制与 hos 信号内抓栈机制死锁了, 关于 hos 信号内抓栈机制可以参见 backtrace() crash: 从 CFI 说起 了解相关背景. #0 0x00007fa122b99f4d in __lll_lock_wait () at /lib64/libpthread.so.0 #1 0x00007fa122b95d1d ...

C++: is_move_constructible

我个人有个习惯, 喜欢在摸鱼的时候翻翻自己之前写过的大块代码. 当时在写这种大块代码时是处于一种很激情的状态, 恨不得立刻将脑袋里的想法泼洒到屏幕上实现出来, 所以就需要一种激情冷却下来之后, 一种事后的角度来审视这坨代码, 看看有咩有当时上头时无意留下的一些蠢活. 这不这次摸鱼就发现了如下代码: struct RawTask { core::Header* ptr; // alway...

Coredump 未解之谜: 哪里来的 0x7f702402bc78

最近又有一个奇怪的 coredump, 在我们的集群中, 开始悄悄地出现: #6 0x00000000003d101e in hologres::SegfaultHandler (sig=11, info=0x7ffd27d367b0, ctx=0x7ffd27d36680) at Z.cc:296 #7 <signal handler called> #8 BugCla...

bpftrace, 与 C++

这篇文章总结下 bpftrace 以及相关工具, bpftrace 帮助我在日常值班, 双11大促(就比如刚刚结束的双 11 一峰), 时快速定位了不少问题. 关于 bpftrace 介绍, 一句话是 bpftrace 可以以极低开销查看运行时进程的状态, 比如函数执行阶段某个局部变量的值等. 这篇文章注重介绍 C++ 程序如何通过 bpftrace 追踪, 而不会过多介绍 bpftrace...

Coredump 未解之谜: 为什么 r14 为 0?

干活的时候, 同事又塞了个 coredump, 咋一看比较直观 r14 寄存器为 0, 导致 SIGSEGV. 0x00007f54b0335cf0 <+0>: push r15 0x00007f54b0335cf2 <+2>: push r14 0x00007f54b0335cf4 <+4>: push...

使用 jegdb 来调试内存相关 crash

这周我值班, 然后值班的时候有个同事找过来让帮忙排查个 coredump; 当时稀里糊涂一起看了下, 正好又有值班上的事情就被打断了. 等忙完了手头上的事情之后忽然又想起了这个 coredump: 咋一看, 这个 coredump 原因很明显, PostgreSQL MemoryContext 结构体被写坏了: (gdb) p *(AllocSetContext*)0x7fe20cc...

backtrace() crash: 从 CFI 说起

最近我们线上一种 crash 出现的频次逐渐升高, 具有完全一致的堆栈, 即在 _M_deallocate() 时收到了 SIGUSR2 信号, 信号里面调用了 backtrace(), backtrace() 触发了 SIGSEGV 导致了 crash. #0 x86_64_fallback_frame_state (context=0x7fc3f69fa3b0, context=0x...

jemalloc 代码精读 0: sz_size2index_compute

为了便于内存管理, jemalloc 引入 size class 的概念, 在 jemalloc 内部只支持分配 size classes 指定的 size 字节. 默认情况下, jemalloc 支持的 size class 有 8byte, 16byte, 32byte, 64byte 等等; 即 jemalloc 内部不支持分配一个大小为 33byte 的内存块. 在 jemalloc...

C 语言: Call to a function without a prototype

上周我一同事找我看一个很有意思的问题, 一个 bool 返回值函数总是返回 true. 简化为如下例子: // 1.c bool _is_valid_jsonb_with_schema() { // 简化后的例子, 实际 _is_valid_jsonb_with_schema 的逻辑有点复杂. return false; } // 2.c void is_valid_js...

从 fetch_add(0) 说起

在写完 C++ memory order: load(SeqCst) VS fetch_add(0, SeqCst) 这篇文章之后, 随着知识的进一步积累的, 一种不踏实感油然而生, 尤其是在收到一封感谢邮件之后: I notice that you have an interesting blog post regarding why fetch_add(0) is used ra...

Spanner: Becoming a SQL System

即上一篇 关于 Spanner 的若干猜测 之后, 继续跟进了 Spanner 另一篇论文 “Spanner: Becoming a SQL System”, 同样这篇文章不是论文介绍文章, 而是对论文一些我感觉模糊的地方所做的猜测. 非常欢迎/希望一起交流一下. 3.1 Distributed query compilation Spanner 中 SQL 优化过程, 当 Spanne...

C++ 的心智负担 -- Integral promotion

我个人习惯于将自己对 C++ 的经验分为三类: 纯粹的知识点, 喜好的代码风格, 以及心智负担; 在心智负担这一类中又记录了心智负担能否被编译器检测出来, 以及对应的编译选项及工具; 从我目前的笔记大小来看, C++ 确实是一个心智负担包袱很大的语言了== 这里介绍一下我记录的其中一个心智负担. 在我将 tokio 完整地移植到 C++ 作为 C++20 coroutine 运行时之后, ...

基于 FlameGraph 的内存泄漏检测

在进一步深入了解 FlameGraph 时, 可以看到火焰图作为一种通用工具, 不单单可以用于 cpu 热点展示, 还可以用与探测 diskio, memory 等热点消耗情况. 其中在 memory 上的功能引起我的兴趣, 在我日常值班线上巡检过程中, 遇到的不少 memory 使用持续上涨但不知所由的情况, 此时需要设置个环境变量开启 jemalloc profile 功能之后重启实例,...