..

遇到一次运行时terminate

背景

安装了Windows的Ubuntu子系统,搭建好编译环境,工程编译成功,运行!,报错

terminate called after throwing an instance of 'std::exception'
  what():  std::exception

一脸懵, 除了知道异常退出了,其他啥有价值的提示也没有。

怎么办

1) 考虑这么原始的提示,应该就是 throw std::exception(); 这样代码。 于是一搜,N多个这样的,这是不给后路啊,其他地方出问题也不好定位。 在这些地方打log肯定是不太合适了。

2) 猜一下大概的位置
之前保留过一份正常的启动流程log,把当前的系统日志调到 trace , 然后对比着看,找到了。
在 websocket 服务器开始 listen 后,就出现了这个error。 找到 server 关于 listen 的代码,之后有一处 try catch, 把 catch 到的 exception 进行了处理,返回隐藏掉了有意义的输出。 好了,给该段代码加上点儿有意义的log,再次编译运行,提示如下

xxxx Address already in use

这是端口被占用导致的。

解决

找到问题, 就好说了。
在配置文件中,找到 ws 服务器使用的端口,要么修改一下, 要么停掉已经使用该端口的进程。
但是,使用 lsof 查看该端口,并没有发现有进程占用。 WHY?
如果换个port,系统起来后,查看该新的port,依然没有任何提示。

wsl的问题? 1
可能是吧,记得去年,在上面跑 meilisearch 这个代码,就出现了 leveldb 相关的问题,也是 wsl 不兼容导致的,也不知道现在修复了没有。


  1. wsl