学习让我快乐

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

小心! 编译器会创建临时对象

是的! 还是我的一个 CR! 在跑测试时又遇到了一个奇怪的 coredump 问题! 总之我解决了! 最小复现代码是: struct Class1 { virtual ~Class1() {} }; struct Class2 : public Class1 { virtual ~Class2() {} }; struct UsefulClass { ExecutionCo...

初始化! 初始化! 又是未初始化!

最近我的一个 CR 反反复复跑了好几轮测试, 每一轮测试都有零星几个测试失败, 每次失败的测试也都不一样, 而且从我 CR 内容上也可以分析到与这些测试毫无关系, 所以我一直信誓旦旦地给测试小姐姐强调不是我的问题, 测试小姐姐就去找 case owner 去排查 case 不稳定的问题. 但考虑到我的 CR 就一直没有跑成功过一轮测试, 而且测试小姐姐被我也折腾烦了: @盏一 请再仔...

陶哲轩实分析: 黎曼积分

这是我关于实分析学习总结的第一篇文章,为了便于读者了解背景和快速进入主题,我认为有必要先介绍一下这篇文章的风格和如何使用。 首先,我为什么会选择学习数学?一方面是因为看到了Jemalloc Profile背后的数学原理所展示的数学的强大和实用性,另一方面则是被Polar Code(极化码)具体原理是怎样的回答所展示的数学对生产力的推动所吸引。为此,我制定了一个全面的数学学习计划,...

Jemalloc Profile 背后的数学原理

Jemalloc Profile 是一个非常有用的功能, 对于一次内存分配, jemalloc 会以一定几率决定是否对这次内存分配进行采样, 如果决定采样, 此时 jemalloc 会保存此次内存分配若干上下文信息, 如堆栈等. 之后可以周期性让 Jemalloc 将其保存的采样信息 dump 到指定文件, 通过文件中记录的采样信息结合 jeprof 等工具我们可以很直观地看出哪些堆栈是内存...

C++ 异常与 longjmp: 尘埃落定

站在代码终于成功合入的背景下, 开始心平气和地回顾整个 C++ 异常与 longjmp 开发过程中一些细节. 系列文章: C++ 异常与 longjmp: 缘起 C++ 异常与 longjmp: 没有想象中那么美好 C++ 异常与 longjmp: 比想象中还要遭 C++ 异常与 longjmp: 尘埃落定 Catch force unwind 如 这里 所示, 一...

C++ 异常与 longjmp: 比想象中还要遭

继在写完 C++ 异常与 longjmp: 没有想象中那么美好, 并且跑通了 Debug 模式测试之后, 我当时真的以为 ‘好的, 这一切到此为止了’, 可以发起 Code Review 了. 但万万没想到, 在 Release 模式下测试跪了. 唉, 从 C++ 异常与 longjmp, C++ 异常与 longjmp: 没有想象中那么美好, 再到本篇 C++ 异常与 longjmp: 比...

C++ 异常与 longjmp: 没有想象中那么美好

在完成 C++ 异常与 longjmp 这篇引子以及原型开发验证之后, 我立马投入到将其实战到我们项目中去, 毕竟我们同学已经深受这个折磨很久了. 我随便举个例子, 我们定义了 HOLO_TRY_BEGIN/HOLO_TRY_END, GPOS_HOLO_TRY/GPOS_HOLO_CATCH_EX/GPOS_HOLO_CATCH_END, HOLO_PG_TRY/HOLO_PG_CATCH...

C++ 异常与 longjmp

在解决这个 C++ 异常与抓栈死锁 问题时, 调研了 C++ 异常机制实现, 看到 C++ ABI 中提到了一嘴: “forced” unwinding (such as caused by longjmp or thread termination). 有点惊喜, 这正好能解决一个困扰我们很久的一个问题. 问题 首先介绍下 PostgreSQL 中的异常处理机制, PG 基...

递归锁并不递归

日常测试时遇到了一个死锁堆栈, 堆栈很明确, 就是异常机制与 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...