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

Tizen Emulator が Segmentation fault する --- 途中 ---(1)

この辺りで作った環境は、Fedora 16 (64bit) の上で仮想的に Ubuntu 12.04 (32bit) として振る舞えるため大変重宝しています。基本的なTizen ApplicationのデバッグはWeb Simulatorがあれば事足りるのですが、やはりTizen Emulatorでデバッグしたいことも皆無ではありません。(Tizen Developer Phoneがあれば事足りますが、万人が持っているわけではないので。。)

上記のUbuntu 12.04 (32bit)環境でTizen Emulatorで起動を試みると、

Ubuntu moguriso@pc:~/tizen_sdk_32/Emulator/bin$ ./emulator-x86 
Segmentation fault (core dumped)

が表示されてしまい、正常に起動することができません。*1
仕事でもXubuntuを使っているため、合間で起動を試したのですが、VMWare上のTizen Emulatorも同じ様にSegmantation faultで起動に失敗しました。そこで、判る範囲でデバッグを試みることにしました。

lddで依存関係の確認

そもそも、ライブラリが全部足りているのか確認します。Tizen Emulatorのbinは~/tizen_sdk/Emulator/binの下にemulator-x86としてインストールされています。これに、下記コマンドを掛けると

Ubuntu moguriso@pc:~/tizen_sdk_32/Emulator/bin$ldd ./emulator-x86

このように返ってきます。

        linux-gate.so.1 =>  (0xf77c0000)
        librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf44a0000)
〜〜(略)〜〜
        libvorbis.so.0 => /usr/lib/i386-linux-gnu/libvorbis.so.0 (0xf3510000)
        libogg.so.0 => /usr/lib/i386-linux-gnu/libogg.so.0 (0xf3508000)
        libresolv.so.2 => /lib/i386-linux-gnu/libresolv.so.2 (0xf34f0000)

Not Foundは無いため、ライブラリの不足は無いようです。

gdbでSegmantation fault箇所を探る

次にGNU gdbでSegmantation faultを起こしている箇所を探ります。

Ubuntu moguris@geozero:~/tizen_sdk_32/Emulator/bin$ gdb ./emulator-x86

として実行すると

GNU gdb (Ubuntu/Linaro 7.4-2012.02-0ubuntu2) 7.4-2012.02
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/moguris/tizen_sdk_32/Emulator/bin/emulator-x86...done.
(gdb)

として、shellがgdbの箇所に移ります。"r"を押してEnterすると、実際にemulator-x86が実行されます。

Starting program: /home/moguris/tizen_sdk_32/Emulator/bin/emulator-x86 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x566d7df9 in main (argc=1, argv=0xffffdc94)
    at /build/build_server/public/jobs/426/temp/tizen/src/emulator.c:321
321     /build/build_server/public/jobs/426/temp/tizen/src/emulator.c: No such file or directory.

と表示され、seg落ちした箇所がemulator.cの321行目だと分ります。

emulator.cのソースを追いかける

Tizen Emulatorのソースはココにあります。フォルダ無しで圧縮されているようなので、一応一時保存ディレクトリを作成して展開します。

Ubuntu moguris@geozero:~/$mkdir emulator-test
Ubuntu moguris@geozero:~/$cd emulator-test
Ubuntu moguris@geozero:~/$wget https://download.tizen.org/sdk/current/source/emulator_1.2.90.tar.gz --no-check-certificate
Ubuntu moguris@geozero:~/$tar xfv emulator_1.2.90.tar.gz

どうも、落ちている箇所は

318 int main(int argc, char* argv[])
319 {
320     parse_options(argc, argv, &skin_argc, &skin_argv, &qemu_argc, &qemu_argv    );
321     get_bin_dir( qemu_argv[0] );
322     socket_init();
323     extract_info(qemu_argc, qemu_argv);

の、get_bin_dir()の中のようです。get_bin_dir()は↓の様になっています。

135 static void get_bin_dir( char* exec_argv ) {
136 
137     if ( !exec_argv ) {
138         return;
139     }
140 
141     char* data = strdup( exec_argv );
142     if ( !data ) {
143         fprintf( stderr, "Fail to strdup for paring a binary directory.\n" );
144         return;
145     }
146 
147     char* p = NULL;
148 #ifdef _WIN32
149     p = strrchr( data, '\\' );
150     if ( !p ) {
151         p = strrchr( data, '/' );
152     }
153 #else
154     p = strrchr( data, '/' );
155 #endif
156     if ( !p ) {
157         free( data );
158         return;
159     }
160 
161     strncpy( bin_dir, data, strlen( data ) - strlen( p ) );
162 
163     free( data );
164 
165 }

怪しい箇所はいくつもありますが、コレという決め手が無いため、一度emulatorをrebuildしてデバッグログを入れてみます。

emulatorのrebuild

configure用のスクリプトが (展開先ディレクトリ)/tizen/build.shにあるので、これをそのまま実行します。自動的にmakeまで進めてくれるのですが、

~tizen/src/maru_sdl.h:43:17: fatal error: SDL.h: No such file or directory

と怒られました。SDL.hの保存先を検索すると

Ubuntu moguris@geozero:~/tizen/emulator-test/tizen$ apt-file search SDL.h
clanlib-doc: /usr/share/doc/clanlib-doc/Reference/html/CL_SetupSDL.html
clanlib-doc: /usr/share/doc/clanlib-doc/Reference/html/CL_SetupSDL__CL_SetupSDL.html
clanlib-doc: /usr/share/doc/clanlib-doc/Reference/html/CL_SetupSDL__~CL_SetupSDL.html
libaxis-java-doc: /usr/share/doc/libaxis-java/api/org/apache/axis/wsdl/Java2WSDL.html
libaxis-java-doc: /usr/share/doc/libaxis-java/api/org/apache/axis/wsdl/class-use/Java2WSDL.html
<b><span style="color: #cc0000">libghc-sdl-dev: /usr/lib/haskell-packages/ghc/lib/SDL-0.6.3/ghc-7.4.1/Graphics/UI/SDL.hi</span></b>
libghc-sdl-doc: /usr/lib/ghc-doc/haddock/sdl-0.6.3/SDL.haddock
libghc-sdl-doc: /usr/share/doc/libghc-sdl-doc/html/Graphics-UI-SDL.html
libghc-sdl-doc: /usr/share/doc/libghc-sdl-doc/html/mini_Graphics-UI-SDL.html
libghc-sdl-doc: /usr/share/doc/libghc-sdl-doc/html/src/Graphics-UI-SDL.html
libplib-dev: /usr/include/plib/puSDL.h
libsdl1.2-dev: /usr/include/SDL/SDL.h
pike7.8-reference: /usr/share/doc/pike7.8-doc/html/reference/ex/predef_3A_3A/SDL.html

libghc-sdl-devを入れればいいように見えます。

Ubuntu moguris@geozero:~/tizen/emulator-test/tizen$sudo apt-get install libghc-sdl-dev

再度、./build.shすると、今度はAT_EMPTY_PATHがdefineされてないと怒られます。google先生にお尋ねしたところ、io/fcnt.hに定義されているはずです。

Ubuntu moguris@geozero:~/tizen/emulator-test/tizen$sudo apt-file search fcnt.h

たくさん出てくるので、ほとんど入れて見ましたがNG。

どうも、configureで仮想ドライバがenableになるのが悪そうな感じで、32bit仮想のchroot環境でも64bitと誤解してhw64等をビルドしたりしている模様。。。

どうも、~/tizen/emulator-test/tizen/qemu_configure.shにconfigureのオプション定義があるので、コレをいじればいいみたい。手元の環境(Ubuntu 12.04 32bit on chroot Fedora16-64bit)では

 10 exec ./configure \
 11  --target-list=i386-softmmu \
 12  --audio-drv-list=alsa \
 13  --disable-vnc-tls \
 14  --audio-card-list=ac97 \
 15  --enable-maru \
 16  --enable-debug \
 17  --disable-attr  \
 18  --enable-gl
 19 # --enable-mixemu \
 20 # --disable-werror \
 21 # --enable-ldst-optimization \
 22 # --enable-ffmpeg
 23 # --enable-v4l2 \
 24 # --enable-profiler \
 25 # --enable-gles2 --gles2dir=/usr

とすると、そこそこまでビルドが進んだ。最終的にantが無いと怒られるので入れる。

Ubuntu moguris@geozero:~/tizen/emulator-test/tizen$ sudo apt-get install ant

emulator-test/tizen/Emulatorにファイルが出来た。
試しに、上記ディレクトリのbin以下にある自分でビルドし直したemulator-x86を動かすとやはりseg落ちした。

泥臭いprintデバッグをしてみると、そもそも関数に入る前に死んでいるみたい。(L322で既にseg fault)

*1:厳密には、ここまで来るまでに、libXXX系が足りず、libGL/libGLU/mesa-driver系などいろいろなものを突っ込んでいます。