在 VS C++ 的调试器中正确显示 UTF-8 字符串内容
众所周知,UTF-8 在 Windows 上一直都不是一等公民,在 MSVC 的调试器里,std::string
默认按照本地编码解释,在中文系统上是 GBK 或 GB2312。
于是,如果一个 std::string
或者 char[]
里存储的是 UTF-8 编码的字符串,那么非 ASCII 部分就会乱码。这在调试中是一个非常不好的体验。
众所周知,UTF-8 在 Windows 上一直都不是一等公民,在 MSVC 的调试器里,std::string
默认按照本地编码解释,在中文系统上是 GBK 或 GB2312。
于是,如果一个 std::string
或者 char[]
里存储的是 UTF-8 编码的字符串,那么非 ASCII 部分就会乱码。这在调试中是一个非常不好的体验。
上一次写年终总结大概在三四年前,因为老博客数据没有备份的缘故,具体是什么时候也记不清了。
BTW,其实我也不是很记得一开始为什么要在春节期间而不是元旦时写上一年的总结。可能和往常元旦时还未放假有关。
17年总体上还算符合个人发展的预期:
上半年接了原来主站投稿工具的锅,和另外一个同事花了一个月多,完全从头开始硬生生的做了一个新版本的投稿工具,还带着新版本要求的压制功能。后续又迭代了两三个版本,后面最新的 v2.0 甚至都已经开始支持简单的视频编辑。
所谓的 Winsock Extension API 指的是微软专门额外添加,由应用层 mswsock.dll 导出的函数集,包括 AcceptEx()
, DisconnectEx()
.etc
使用这部分 API 的原因是它们通常支持更新更牛X的特性,且几乎大多数都是异步函数。
如果应用程序存在多个模块,那么有很大的可能通过 SetUnhandledException()
安装的崩溃处理函数和发生崩溃的地址不在一个模块内,因此直接在 crash handler 里使用当前模块地址是错误的做法。
一个可行的方法是,利用崩溃时的上下文信息 EXCEPTION_POINTERS
,拿到触发崩溃的地址 EIP/RIP,然后利用 Windows 7 新增的 GetMappedFileNameW()
拿到某个地址所在的模块的完整设备路径。