在 Windows 上获取崩溃的模块名和模块内地址偏移

如果应用程序存在多个模块,那么有很大的可能通过 SetUnhandledException() 安装的崩溃处理函数和发生崩溃的地址不在一个模块内,因此直接在 crash handler 里使用当前模块地址是错误的做法。

一个可行的方法是,利用崩溃时的上下文信息 EXCEPTION_POINTERS,拿到触发崩溃的地址 EIP/RIP,然后利用 Windows 7 新增的 GetMappedFileNameW() 拿到某个地址所在的模块的完整设备路径。

Read More

Monthly Read Posts in Jan 2018

C++17 constexpr everything (or as much as the compiler can)

Read More

正确地初始化 std::atomic_flag

根据标准文档的要求,std::atomic_flag 只有利用 ATOMIC_FLAG_INIT 初始化之后,才获得一个确定的初始状态。

现在假设我们要自己实现一个 spin-lock,那么只需要利用 std::atomic_flag 实现一个 spin-mutex:

Read More

Binding to Privately Inherited Member Functions

考虑代码

#include <functional>

Read More

Monthly Read Posts in Dec 2017

C++ 11 Concurrency: Part 1 & Part 2 & Part 3

Read More

自动为 enum 类型添加位运算操作符

有时候需要在 C++ 里用 enum (class) 表示 flags,进行基础的 bitwise 运算,而哪怕是支持自动到 underlying integer 转换的 traditional enum,也需要额外的 cast 才能实现,所以在需要的时候为 enum 添加位运算支持还是有一定市场的。

Read More

Monthly Read Posts in Nov 2017

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
CppCon 2014: Unicode in CPP

Read More