记一次使用pycoin遇到的坑

问题和教程都有时效性,我一般写的都很少,很多依赖于版本或者系统,当遇到问题更建议去 Stack Overflow 或者 Github issue 中搜索,也或者直接使用 Google 搜索,肯定很多人乐于写这些。不过我今天还是水了一篇文章。

版本和软件环境

1
2
3
4
System: MacOS 10.15
Python: 3.7.6
gunicorn: 19.9.0
pycoin: 0.90.20190728

问题

我在家里电脑启动一个 gunicorn 服务时,出现 worker 无法的情况,但是并没有任何保存,只有 worker 重启日志,因为没有报错,排查起来就比较麻烦了。我使用的 pipenv 启动的,软件依赖问题可能性很小。当我尝试使用 ipython 运行的时候,则会报错 Abort trap

解决

这时候会发现服务并没有抛错,而我还没办法定位哪里出现的异常,并且吞掉了错误信息。如果使用 pdb 这种工具,定位错误是很费力的。想要快速定位 Abort 位置,可以使用 PYTHONVERBOSE 环境变量。

将 PYTHONVERBOSE 设置为 3 再启动服务,会打印加载模块时的日志,闪退后最后输入的日志,就是我们要定位的地方。通过这种方式我知道是 pycoin 加载 openssl 动态链接库的时候报错了,因为使用了 pycoin 的 ecdsa 模块,并且还是用了 openssl 加速,找不到动态链接库才闪退的。

我们可以将 /usr/local/Cellar/openssl 下的动态链接库拷贝到 /usr/local/lib/ 下,并且再做软连接。

1
2
3
4
5
6
brew install openssl
cd /usr/local/Cellar/[email protected]/1.1.1i/lib
sudo cp libssl.1.1.dylib libcrypto.1.1.dylib /usr/local/lib/
cd /usr/local/lib
sudo ln -s libssl.1.1.dylib libssl.dylib
sudo ln -s libcrypto.1.1.dylib libcrypto.dylib

参考