2026-06-04
一、为什么要再封一层 CMake
CMake 很强,但刚开始接触时也很容易写乱。
比如我们想做一件很普通的事:写一个 hello object library,再写一个 basic_hello_world 可执行程序去使用它。原生 CMake 可能会这样写:
add_library(hello OBJECT hello/src/hello.cpp)
target_include_directories(hello PUBLIC hell…
2026-05-26
大模型已经很会写代码了,但真正用起来以后,很多人会遇到一个尴尬问题:它能很快生成一大堆东西,却不一定稳定、可维护、符合项目约定。
第一次看起来很惊艳,第二次开始风格漂移,第三次改坏旧逻辑,第四次你发现自己在给 AI 生成的代码收拾现场。于是效率提升没有想象中那么大,问题从“我写代码慢”变成了“我审 AI 代码很累”。
Harness Engineering 要解决的就是这个问题。
它不是一个新框架,也不是某个插件,而是一种使用 AI A…
2026-05-25
很多 Native 服务一旦跑起来,最难处理的不是"有没有日志",而是"我现在能不能在不中断进程的情况下问它几个问题"。
比如一个投屏服务、音视频服务或嵌入式后台任务,现场经常需要临时确认:
当前模块是否还活着。
编码器参数是否按预期生效。
某个状态机卡在哪一步。
是否可以临时触发一次 IDR、刷新、重连或 dump。
日志之外的运行时状态能不能直接读出来。
只靠日志不够。日志是被动输出,调试入口是主动查询。xdebug 的目标就…
2026-05-21
epoll 经常被介绍成"高性能网络 I/O 多路复用接口",这句话没错,但它只讲了最常见的一半用法。
在真实工程里,epoll 更像一个统一的事件入口。网络读写、退出通知、信号处理等事件都可以汇入同一个 wait 点,主线程只需要围绕这个 wait 点做分发,而不必在多个阻塞点和轮询逻辑之间来回切换。
这篇文章会围绕 Linux "一切皆文件" 的设计思想,整理几个 epoll 的实用技巧:
用 socketpair 或 signa…
2026-05-19
一、问题背景
C++ 程序线上崩溃时,最常见的日志可能只有一句:
Segmentation fault (11)
这句话只告诉我们程序收到了 SIGSEGV,也就是访问了不该访问的内存。但它没有告诉我们:
崩溃发生在哪个函数。
这个函数是谁调用的。
对应源码文件和行号是什么。
线上 release 二进制被 strip 后还能不能还原现场。
crashtrace 这个仓库就是为了解决这个问题:它把 C++ 崩溃栈能力拆成一套小型库、…