学习让我快乐

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

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...

使用 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...