この辺りで作った環境は、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系などいろいろなものを突っ込んでいます。