使用std::future与币安WebSocket API时的程序异常问题排查
问题排查与分析
问题1:程序运行到一半无响应且不终止
- 排查
std::future的逻辑:检查是否存在future.get()/wait()未正确触发的情况,比如WebSocket回调是否在收到服务器时间后调用promise.set_value(),若回调未执行或promise关联错误,主线程会持续阻塞。 - 检查WebSocket连接状态:添加连接异常、断开的回调逻辑,确认是否出现连接挂起但未触发程序退出的情况——比如未处理心跳超时,导致连接僵死。
- 确认主线程与WS事件循环的协作:若使用阻塞式WS客户端,主线程可能卡在WS消息循环中无法推进后续逻辑,可考虑将WS事件循环放到独立线程中运行,避免阻塞主线程。
问题2:ws_diff_delay.cpp第84、85行触发栈溢出(错误码0xC0000409)
- 对比两行代码的核心差异:栈溢出通常因栈上分配过大内存导致,大概率是其中一行用了值传递大型对象(比如大结构体、数组),另一行用了引用/指针传递。值传递会把整个对象拷贝到栈上,超过栈的默认容量(通常几MB)就会触发溢出;引用传递仅传递指针,不会占用过多栈空间。
- 结合汇编第24行指令分析:若汇编指令是
push大尺寸内存块到栈,可直接确认是值传递大对象导致的溢出。比如代码中写func(large_obj)而非func(&large_obj)/func(std::ref(large_obj)),就会触发这类问题。 - 检查
std::future绑定的任务:若lambda表达式按值捕获了大型容器/对象,任务执行时也会在栈上分配大量内存,改成引用捕获(需确保对象生命周期足够)或用std::shared_ptr动态分配即可避免。
内容的提问来源于stack exchange,提问作者Monhde Sau Hung
相关产品推荐
相关产品推荐

