Visual Studio Express 2013 で PHP をステップ実行する

PHP Advent Calendar 2013 in Adventar の20日目です。


今日は IDE を使って PHP をステップ実行してみたいと思います。

Eclipse PDT? PHPStorm? いいえ、そういうのは使いません。

使うのは↓コレです。PHP のスクリプトではなく PHP そのものをステップ実行します。

Visual Studio Express 2013 for Windows Desktop

まずは Visual Studio Express 2013 for Windows Desktop をダウンロードしてインストールします。

PHP といえば Web ですが Visual Studio Express 2013 for Web は関係ありません。 また Visual Studio Express 2013 for Windows というのがありますが、これはストアアプリ用なので関係ありません。

公式のビルドは 2012 ですが 2013 でも問題ありません(拡張モジュールをビルドして公式のビルドにリンクするなら揃える必要がありますが)。

PHP のソースとバイナリ

PHP の Windows 版のバイナリを置いている下記のページを開きます。

次の3つをダウンロードします。

  • ソースファイル(Download source code というリンク)
  • バイナリファイル(Zip というリンク)
  • PDBファイル(Debug Pack というリンク)

バイナリと PDB ファイルはとりあえず一番上にある VC11 x86 Non Thread Safe からダウンロードしてください。

プロジェクトの作成

Visual Studio を起動してメインメニューの「ファイル > 新しいプロジェクト」を選択します。

「新しいプロジェクト」の画面が開くので、左のペインで「Visual C++」を選択、中央のペインで「メイクファイルプロジェクト」を選択、下部の名前やディレクトリを適当に入力して「OK」をクリックします。

もしかしたら「ソリューションのディレクトリを作成」チェックボックスが On になっているかもしれませんが、On でも Off でもどっちでもいいです。よくわからなければ Off にしてください。

「メイクファイルプロジェクトウィザード」が開きますが、とくに設定するものはないのですぐに「完了」をクリックします。

ソースファイルとバイナリを配置

プロジェクトのディレクトリが作成されるので、そのディレクトリに PHP のソースファイルとバイナリを解凍します。

プロジェクトのディレクトリの直下にベタッと解凍してもいいのですが、適当にディレクトリを掘っても大丈夫です。

とりあえずソースファイルは src ディレクトリに、バイナリはアーカイブのファイル名をそのままディレクトリ名にしてその中に解凍しました。

PDB ファイルの配置

PDB ファイル(Debug Pack というリンクからダウンロードしたやつ)を配置します。

この PDB ファイルはそれぞれ exe や dll に対応しているので、同名の exe や dll のあるディレクトリに配置してください。

要するに php.pdb php5.pdb php-cgi.pdb php-win.pdb はバイナリのディレクトリの直下、その他はバイナリのディレクトリの ext の中に配置します。

PHP スクリプトの配置

デバッグ実行するための PHP スクリプトを作成します。

プロジェクトのディレクトリの直下に debug.php で適当なスクリプトを作成してください。

debug.php

<?php
is_dir(__DIR__);

ここまででディレクトリ構成は大体次のようになります。

php/
  php.sln
  php.vcxproj
  debug.php
   :
  src/
    build/
    ext/
    main/
     :
    acinclude.m4
    buildconf
    buildconf.bat
     :
  php-5.5.7-nts-Win32-VC11-x86/
    php.exe
    php.pdb
    php5.dll
    php5.pdb
    php-cgi.exe
    php-cgi.pdb
    php-win.exe
    php-win.pdb
     :
    ext/
      php_bz2.dll
      php_bz2.pdb
       :

プロジェクトの設定

Visual Studio に戻ります。

メインメニューの「プロジェクト > プロパティ」を選択します。

開いたダイアログの左のペインで「構成プロパティ > デバッグ」を選択して、中央のペインで次の通りに設定します。

  • コマンド引数: -n debug.php

さらに「構成プロパティ > NMake」を選択して、中央のペインで次の通りに設定します。

  • ビルドコマンドライン:
  • すべてリビルドコマンドライン:
  • クリーンコマンドライン:
  • 出力: $(ProjectDir)\php-5.5.7-nts-Win32-VC11-x86\php.exe

デバッグ実行

ソリューションエクスプローラーの右上の方にある「すべてのファイルを表示」を選択します。 トグルになっているので1回だけ押してトグルが ON になるようにしてください。

このトグルを ON にするとディレクトリ内のファイルがソリューションエクスプローラーに表示されます。

src/ext/standard/filestat.c を開いて 906 行目の左端をクリックしてブレークポイントを設定します。

ここまでできればあとは F5 を押すだけです。途中で「このプロジェクトは変更されています」というダイアログが出るかもしれませんが、気にせず「はい」をクリックしてください。

PHP が実行され、ブレークポイントを仕込んだところで止まります。あとは焼くなり煮るなり好きにしてください。

さいごに

当初は PHPVisual Studio でビルドしてステップ実行する予定だったのですが、ステップ実行するだけなら自前でビルドするまでもないなーと思ったので変更しました。

ただし、公式のビルドは最適化されているためソースコードの見た目通りに実行されないことがあります。 例えばあるはずのローカル変数が存在しなかったり、インライン展開された関数だとその中にはステップイン出来なかったりします。

また、PDB ファイルの読み込みやソースファイルの検索が上手くいかないこともあるので、その辺りも含めてきちんとデバッグ実行したければやはり自前でビルドした方が良いです。