[Firefox OS][FxOS][Gecko]デバッグ情報付きのビルド


 藪下@2課のガジェオタです。

 ちょっとFirefox OSのGeckoのソースコード読んだりしていてスタックトレース取りたいなとか思うところがあったのでデバッグ情報付きのビルドを試してみました。
 今日の目次。

      デバッグビルド設定
      ビルド
      ディスアセンブル

デバッグビルド設定

 FxOSのビルド設定には.userconfigファイルを使います。
 以下MDNの解説ページです。

Customization with the .userconfig file
https://developer.mozilla.org/en-US/docs/Mozilla/Firefox_OS/Customization_with_the_.userconfig_file
#日本語がないので誰か訳して!

 最初のほうに書いてある通りビルド環境のルートに.userconfigを置いてその中に設定を書いてねということです。
 デバッグビルドは以下のフラグです。

export B2G_DEBUG=1

 最適化を抑えたい場合のフラグもあります。今回はつけません。

export B2G_NOOPT=1

ビルド

 ビルドはいつものgeckoビルド。

./build.sh gecko

 お目当てはlibxul.soあたりなので探してサイズ見てみましょうかね。

$ find -name libxul.so -ls
3957733  17456 -rw-r--r--  1 root       yabushita   17871052  8月  6 04:01 ./backup-keon/system/b2g/libxul.so
2640914  37960 -rwxr-xr-x  1 yabushita  yabushita   38869944  6月 11 04:42 ./gaia/xulrunner-sdk/bin/libxul.so
2637188  44820 -rwxr-xr-x  1 yabushita  yabushita   45894424  6月 11 04:41 ./gaia/xulrunner-sdk/sdk/lib/libxul.so
2640866  44820 -rwxr-xr-x  1 yabushita  yabushita   45894424  6月 11 04:42 ./gaia/xulrunner-sdk/lib/libxul.so
2492722      0 lrwxrwxrwx  1 yabushita  yabushita         31  9月 18 19:56 ./objdir-gecko/dist/bin/libxul.so -> ../../toolkit/library/libxul.so
2658747      0 lrwxrwxrwx  1 yabushita  yabushita         34  9月 18 19:56 ./objdir-gecko/dist/sdk/lib/libxul.so -> ../../../toolkit/library/libxul.so
2658991  17556 -rwxrwxr-x  1 yabushita  yabushita   17975724  9月 18 19:57 ./objdir-gecko/dist/b2g/libxul.so
2492723      0 lrwxrwxrwx  1 yabushita  yabushita         31  9月 18 19:56 ./objdir-gecko/dist/lib/libxul.so -> ../../toolkit/library/libxul.so
2495101 466732 -rwxrwxr-x  1 yabushita  yabushita  477927944  9月 18 19:56 ./objdir-gecko/toolkit/library/libxul.so
2115069  17556 -rwxr-xr-x  1 yabushita  yabushita   17975724  9月 18 19:57 ./out/target/product/keon/system/b2g/libxul.so

 おや?
 dist配下というかoutに入った奴はデバッグシンボルついてなさそうですね。
 なんでかすら? ビルドの後にstripしちゃったりなんかしちゃったり?

ディスアセンブル

 とりあえずtoolkit配下のはでっかくなってるのでobjdumpしてみましょう。-Sスイッチで混合モードですね。

$ prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-objdump -S objdir-gecko/toolkit/library/libxul.so > ~/Documents/FxOS/libxul-debug.asm

 ソースコード出てたところを一部抜粋。インライン展開うぜえ。。。

NS_IMETHODIMP
nsCacheEntryDescriptor::SetCacheElement(nsISupports * cacheElement)
{
  2e113c:	b537      	push	{r0, r1, r2, r4, r5, lr}
  2e113e:	4604      	mov	r4, r0
  2e1140:	20b1      	movs	r0, #177	; 0xb1
  2e1142:	460d      	mov	r5, r1
  2e1144:	f000 ffd8 	bl	2e20f8 <_ZN14nsCacheService4LockEN7mozilla9Telemetry2IDE>
    nsCacheServiceAutoLock lock(LOCK_TELEM(NSCACHEENTRYDESCRIPTOR_SETCACHEELEMENT));
    if (!mCacheEntry)                 return NS_ERROR_NOT_AVAILABLE;
  2e1148:	6920      	ldr	r0, [r4, #16]
  2e114a:	4c08      	ldr	r4, [pc, #32]	; (2e116c <_ZN22nsCacheEntryDescriptor15SetCacheElementEP11nsISupports+0x30>)
  2e114c:	b140      	cbz	r0, 2e1160 <_ZN22nsCacheEntryDescriptor15SetCacheElementEP11nsISupports+0x24>

    bool IsDoomed()          { return (mFlags & eDoomedMask) != 0; }
    bool IsEntryDirty()      { return (mFlags & eEntryDirtyMask) != 0; }
    bool IsDataDirty()       { return (mFlags & eDataDirtyMask) != 0; }
    bool IsMetaDataDirty()   { return (mFlags & eMetaDataDirtyMask) != 0; }
    bool IsStreamData()      { return (mFlags & eStreamDataMask) != 0; }
  2e114e:	6a83      	ldr	r3, [r0, #40]	; 0x28
  2e1150:	04d9      	lsls	r1, r3, #19
    if (mCacheEntry->IsStreamData())  return NS_ERROR_CACHE_DATA_IS_STREAM;
  2e1152:	bf48      	it	mi
  2e1154:	4c06      	ldrmi	r4, [pc, #24]	; (2e1170 <_ZN22nsCacheEntryDescriptor15SetCacheElementEP11nsISupports+0x34>)
  2e1156:	d403      	bmi.n	2e1160 <_ZN22nsCacheEntryDescriptor15SetCacheElementEP11nsISupports+0x24>

    return nsCacheService::SetCacheElement(mCacheEntry, cacheElement);
  2e1158:	4629      	mov	r1, r5
  2e115a:	f000 ff59 	bl	2e2010 <_ZN14nsCacheService15SetCacheElementEP12nsCacheEntryP11nsISupports>
  2e115e:	4604      	mov	r4, r0
  2e1160:	a801      	add	r0, sp, #4
  2e1162:	f7ff f90b 	bl	2e037c <_ZN22nsCacheServiceAutoLockD1Ev>
}

 混合モードでディスアセンブルできましたー。
 あとはdistとかoutに入ってくれたらいいんですけどなんで入らぬの? 教えて偉い人!

#2013/11/19追記
 rm -rf objdir-geckoしてあげると多分うまく行きます。
 .mozconfigとかを調べてみたのでそのエントリはまた後日。

おまけの宣伝

 あ、藪下の個人的な活動ですがFxOSコードリーディングという会を始めてみました。
 Firefox OS勉強会で知り合った人たちとFxOSのソースコードを読んで意見交換してます。
 藪下の成果は本ブログに書いていくつもりです。

FxOSコードリーディング
https://www.facebook.com/groups/1408800662676489/

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">