Valgrindを使用してデバッグする

S

ValgrindDSS により開発者はメモリアロケーションや、スレッド/プロセスや、その他プログラムのパフォーマンスについての情報にアクセスできます。これはFirefox OS ツリーに含まれていて、適切なリソースのある特定の電話機で実行できます。この記事では使用方法を説明します。

必要条件

Firefox OSでValgrindを実行する前に、開発者はDebugging Mozilla with ValgrindDSDDSDDSGの記事を読んで慣れておく事が推奨されます。ビルドとコマンドラインのステップの多くがFirefox OSのビルド、実行スクリプトで考慮されていますが、その中の情報の大半はFirefox OSで実行する事に関連しています。

電話機の Firefox OS で Valgrind を実行するには、通常スペックよりも高めの電話機が必要です。Valgrindはリソースに敏感で、RAMが1GB未満の電話機では、一般に低メモリエラーを起こします。これを書いている時点 (2013-12-04) で、Valgrind は2GBのRAMのNexus 4で Firefox OS の動作テストをされています、しかしGeeksphone Keonや同様スペックの電話機で動作するでしょう。利用できる電話機の詳細については Phone and device data を見て下さい。

FxOS電話機でValgrindを実行する

Valgrindを実行する処理を見ていきましょう。

コンパイルする

Valgrind を有効にして Firefox OS をビルドするには、下記を.userconfig ファイルに追加します。

export B2G_VALGRIND=1 

デバッグビルド (B2G_DEBUG) も推奨です。最適化なしビルド (B2G_NOOPT) は使用できないくらい遅く実行し、最適化がエラーを分かりにくくしていると考えられる場合を除き推奨されません。

実行する

記: Firefox OS電話機でValgrindを実行する事は、ホストOSではなく、電話機のコンテキストで行われます。これが意味する所は、開発者はadbが利用できるあらゆるプラットフォームを使用できて、電話機でValgrindを実行するには run-valgrind.sh スクリプトを使用します。

Valgrindの元に Firefox OS を実行するには、B2Gディレクトリから run-valgrind.sh スクリプトを実行します。このスクリプトは下記を行います:

  1. 電話機のファイルシステムを r/w として再マウントします。
  2. 現在のデバッグ libxul.so を全シンボル付きで電話機にコピーします。このファイルは数百MBあるため、このステップ完了まで多数の時間がかかることがあります。新しくビルドされるごとに毎回再実行される必要があります。valgrind を libxul コピーせずに実行するには、このコマンドを実行します:
    run-valgrind.sh nocopy
  3. 電話機を再起動します。
  4. 電話が起動する時に開始する b2g プロセスを停止します。
  5. valgrindの元に、自身の b2g プロセスを実行します。

run-valgrind.sh スクリプトを実行している時の全 valgrind 出力は、ターミナルの標準出力へ書き出されます。これはターミナルかファイルへのパイプいずれでも読み込みできます。

: run-valgrind.sh スクリプトはb2g プロセスを実行する、自身のadbプロセスを保有するため、このスクリプトを停止すると電話機のb2gとvalgrindも停止します。おかしな状態になることがあるため、valgrindセッション実行後に電話機を再起動することが推奨されます。

デスクトップ版Firefox OSでValgrindを実行する

Running valgrind against デスクトップ版Firefox OSに対してvalgrindを実行するのは、デスクトップ版Firefoxに対して実行するのと同じ方法動作します。詳細情報はValgrindを使ってMozillaをデバッグするDDSのページを調べて下さい。関連したビルドフラグが mozconfigに追加され、このページにあるプラットフォーム特有の問題が適用できるでしょう。

注意する点として、デスクトップで Valgrind を OOP/process-per-tab モードで実行するには、確実に子プロセスもトレースできるように、下記のオプション追加が必要です:

--trace-children=yes

Firefox OS Valgrindをメンテ、更新する

適用できるパッチが上げられた時、Firefox OS 用のValgrindはフォークされたリポジトリでメンテされて、Firefox OSのビルドツリーやバージョンの奇抜さへの対処もしつつ、なるべく最新状態を保ちます。

Valgrindリポジトリの更新

警告: GITの経験が必要です。複雑なGit操作に慣れていない場合は、valgrindリポジトリを更新しないでください。githubリポジトリへのあらゆる更新はgit.mozilla.org に反映され、次に開発者がマニフェストリポジトリのHEADを使って取得してしまうでしょう。Valgrindを壊してもValgrindを有効にしていないビルド(例 ビルドボット自動化)は壊れず、これを使ってみようとする開発者の邪魔になります。

Firefox OS valgrind と VEX の主なリポジトリはここです

マスターブランチはこれらのリポジトリの各SVN トランクの初期バージョンで、一方 Firefox OS ブランチはトランクの最上位にrebaseされたFirefox OS固有のパッチを含んでいます。

記: 必ず両方のリポジトリを同時に更新して下さい。これらは2つの別のリポジトリですが、VEX は通常 Valgrind のサブモジュールで、valgrind のHEADは通常 VEX のHEAD を指しています。

これらはB2Gマニフェストで使うために、the git.mozilla.org ドメイン上に複製されます:

  1. 主なリポジトリはgit svnを使ってvalgrind SVNと同期されます。リポジトリの更新を取得するには、github から valgrind と vex のリポジトリを複製してから、次を実行します:
    git svn init -s [subversion repo url]
    
  2. SVN情報の取得は時間がかかりますが、完了した時、あなたのツリーは主な Valgrind SVN と同期されているはずです。
  3. 更なる更新を取得するには、次の一連コマンドを使います:
    git checkout master
    git svn fetch
    git svn rebase
    git push [github-remote-name] master
    git checkout fxos
    git rebase master
    
  4. Firefox OSのブランチを rebase するステップでパッチの衝突がある可能性があります。 問題に対処できない場合、衝突したコミットの作者にeメールして下さい。
  5. rebase の後に、B2G_VALGRIND フラグ付きでFirefox OS のフルビルドを行い、穏やかなビルドであることを確かめます。最もよく必要になる修正は、下記のスクリプト節にリスト化しています。
  6. いったんFirefox OSツリーのビルドの rebase とテスト が完了したら、headの変更により、Firefox OS ブランチを強制的にプッシュしないといけなくなるでしょう。
    git push -f [github-remote-name] fxos

スクリプトをビルド、インストール、実行する

Valgrind Firefox OS ブランチや、リポジトリ取得後に更新が必要なB2Gリポジトリの一部である複数のスクリプトがあります。

external/valgrind/android.mk

これは Android のビルドシステムスクリプトです。しばしば、Valgrind ツリーにファイル追加/削除されることにより、ここに変更が必要となります。-j1 ビルドを使ってどのターゲットがビルドに失敗するかを見て、もしファイルを見つけられなかったり存在しないファイルを参照している場合、プロジェクトのファイルリストを更新します。

external/valgrind/valgrind.mk

これはビルドされて FxOS のシステムイメージに追加される必要のあるパッケージリストを含んでいて、このリストは gonk-misc/b2g.mk に参照されます。Valgrind が新規パッケージを追加するのはまれなため、これは通常更新の必要ありますせん、しかし必要な場合、ここに置きます。

run-valgrind.sh

電話機で Valgrind を実行するためのスクリプト。電話機で Valgrind を実行するのに必要な新規のコマンドライン引数がある場合、ここに置きます。これはデバッグシンボル付きのライブラリをコピーする場所で、よってそのプロセスのあらゆる調整・変更はここで起こるべきです。

ドキュメントのタグと貢献者

タグ: 
 このページの貢献者: chrisdavidmills, hamasaki, Uemmra3
 最終更新者: chrisdavidmills,