読者です 読者をやめる 読者になる 読者になる

OpenSuSE 上の gbs を ver 0.21 => 0.22に更新したらseg落ちするようになった件

Tizen Tips
moguriso@balthazar:~/$ gbs
Segmentation fault

そもそも、gbsはpythonスクリプトでしか無いハズなのに何故にSeg落ちなのか。Seg落ちという事はpythonインタプリタそのものがお亡くなりになっているということですがなんでやねん、と。。

というわけで、pythonのデバッガ pdb とやらで追っかけようとする。

moguriso@balthazar:~/$ python -m pdb /usr/bin/gbs
> /usr/bin/gbs(19)<module>()
-> """Gbs - commandline tool for Tizen developers. Main module."""

n:next、s:step、r:runでゴリゴリ追っかけてみるものの

(Pdb) s
> /usr/bin/gbs(21)<module>()
-> import sys
(Pdb) s
> /usr/bin/gbs(22)<module>()
-> import os
(Pdb) s
> /usr/bin/gbs(24)<module>()
-> from argparse import ArgumentParser
(Pdb) s
--Call--
> /usr/lib64/python2.7/argparse.py(62)<module>()
-> """

pythonわからないので意味不明。。。仕方ないのでgdbpythonごとデバッグする

moguriso@balthazar:~/$ gdb python
~(略)~
(gdb) r /usr/bin/gbs
Starting program: /usr/bin/python /usr/bin/gbs
Missing separate debuginfo for /lib64/ld-linux-x86-64.so.2
~(略)~
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff3ad7290 in initpycurl () from /usr/lib64/python2.7/site-packages/pycurl.so

btの結果が

(gdb) bt
#0  0x00007ffff3ad7290 in initpycurl () from /usr/lib64/python2.7/site-packages/pycurl.so
#1  0x00007ffff7b2ca16 in _PyImport_LoadDynamicModule () from /usr/lib64/libpython2.7.so.1.0
#2  0x00007ffff7af8f1d in ?? () from /usr/lib64/libpython2.7.so.1.0
#3  0x00007ffff7af9269 in ?? () from /usr/lib64/libpython2.7.so.1.0
#4  0x00007ffff7af9564 in ?? () from /usr/lib64/libpython2.7.so.1.0
#5  0x00007ffff7af9b2a in PyImport_ImportModuleLevel () from /usr/lib64/libpython2.7.so.1.0
~(略)~
#39 0x00007ffff7b3b1fd in Py_Main () from /usr/lib64/libpython2.7.so.1.0
#40 0x00007ffff7494a15 in __libc_start_main () from /lib64/libc.so.6
#41 0x0000000000400791 in _start ()

というわけで、pythonからcurlを呼び出すラッパーライブラリらしきもので引っかかっているらしい。gbsのコマンドライブラリは↓にまとめられていて

moguriso@balthazar:/usr/lib/python2.7/site-packages/gitbuildsys$ ls
__init__.py        cmd_chroot.pyc       cmd_export.py       cmd_remotebuild.pyc  log.py       safe_url.pyc
__init__.pyc       cmd_clone.py         cmd_export.pyc      cmd_submit.py        log.pyc      utils.py
cmd_build.py       cmd_clone.pyc        cmd_import.py       cmd_submit.pyc       oscapi.py    utils.pyc
cmd_build.pyc      cmd_createimage.py   cmd_import.pyc      conf.py

gbsが該当のスクリプトを読んでいる部分はutil.pyの↓の辺り

186 class URLGrabber(object):
187     '''grab an url and save to local file'''
188 
189     def __init__(self, connect_timeout=30):
190         '''create Curl object and set one-time options'''
191         curl = pycurl.Curl()
192         curl.setopt(pycurl.FAILONERROR, True)
193         curl.setopt(pycurl.FOLLOWLOCATION, True)
194         curl.setopt(pycurl.SSL_VERIFYPEER, False)
195         curl.setopt(pycurl.SSL_VERIFYHOST, False)
196         curl.setopt(pycurl.CONNECTTIMEOUT, connect_timeout)

この__init__時点で既に吹っ飛んでる模様。ここの、SSLをゴニョゴニョしてる辺りが、実はlibsslの更新に追従してないんじゃないかと勝手に辺りを付けて、gitから最新のpycurlを取ってきて入れなおしたら動く様になりました。

手順は↓の感じ

moguriso@balthazar:~/$ git clone https://github.com/pycurl/pycurl
cd pycurl
make
sudo make install

で、gbsが落ちずに動く様になりました。zypper upしても更新無いっぽいので、SuSEのrepoではマダ治ってないんだろうか・・・*1

個人的には動けば良いのでどうでもいいですが、本来の手順としては、いいのかどうかは知りません、、、

*1:あまり興味ありません...