背景
Linux上要安装个Homebrew,至少要ruby 2.6.3,apt install安装的只有2.5,于是搜索得可以用rbenv、rvm安装,测试apt install rbenv
安装后也只能装2.5的ruby,于是add ppa:~real-gc/ubuntu/rvm,报错 Error: ‘~real-gc’ user or team does not exist.
解决办法
sudo add-apt-repository ~real-gc/ubuntu/rvm
执行带上当前用户环境变量以使用代理
诊断
我先通过strace
跟踪上面的命令,在输出Error前,看到进程先connect
一个IP的443端口成功,且write
成功,然后read
时读到长度为0;我以为read
到为0就没有异常。但是这应当时异常的最后一个系统调用,其实一般这就是引起异常的原因.
看到StackOverflow:cant-add-ppa-on-ubuntu-15-10-user-or-team-does-not-exist一句评论:
added a print(e) to the catch block in def _get_https_content_py3 in /usr/lib/python3/dist-packages/softwareproperties/ppa.py to get the actual error
我也编辑ppa.py
通过关键字team
找到打印错误信息的位置,print(e)
,显示https://launchpad.net/api/~real-gc
访问错误,所以原因找到了,是网络原因。办公电脑一访问果然RESET. 另一个StackOverflow回答提到是网络原因,但是他建议ping google.com
;这里抛出异常不仅不具体还引起歧义了,加大了问题定位难度。
总结
- 对系统调用
read
返回0
引起警惕,显然是出现了异常,read
返回0
啥也没读到,不合常理. - 异常输出应当具体些,而不是使用业务上宽泛的异常,这里是IO异常却变成了
user or team does not exist.
strace
跟踪系统程序时关注打开的文件(特别是可执行文件)和网络连接,connect and read
- 问题:没有参考那个评论,我应该怎么定位问题呢? 翻Linux源码找关键字…
strace
没用精罢了! - 为什么用
nip.io
也没能绕过深信服审查器?因为mutmeg(squid)匹配URL查找主机失败,IP: 91.198.89.222