visual studio codeでapache httpd 2.4をデバッグする

virtualboxvagrantを使用してcentos7の仮想環境を構築しvisual studio code
apache httpd 2.4をデバッグしてみたいと思います。

ホストオンリーアダプタを使用し、仮想環境のipアドレスを固定するため、 virtualbox側で ホストネットワークマネージャーの設定を行います。  f:id:kojima4994:20190914034728p:plain

Vagrant ファイル

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.hostname = "apache-test"
  config.vm.box = "centos/7"

  config.vm.network "private_network", ip: "192.168.56.12"

  config.vm.provider "virtualbox" do |vb|
    vb.cpus = 4
    vb.gui = true
    vb.memory = 1024 * 8
  end

  config.vm.provision "shell", inline: <<-SHELL
  sudo yum update -y
  SHELL
end

  作成したVagrantファイルから仮想環境を作成します。
ホスト

$ vagrant up

起動処理が完了したらログインをし、GNOME Desktopをインストールします。
ホスト

$ vagrant ssh

ゲスト

$ sudo yum group install "GNOME Desktop"

デスクトップを起動させます。(VirtualBoxGUIから行います)
ゲスト

$ startx

デスクトップが立ち上がったところで、必要なモジュール群をインストールしていきます。
ゲスト

$ sudo yum install gcc gdb apr-devel apr-util-devel pcre-devel

visual studio code rpmパッケージをダウンロードし、yumでインストールします。
ゲスト

$ sudo yum install code-xxxx.rpm

apache httpd apacheのサイトからソースコードをダウンロードし、インストールしていきます。
ゲスト

$ tar -zxvf httpd-2.4.41.tar.gz
$ cd httpd-2.4.41.tar.gz
$ CFLAGS="-g" ./configure --prefix=/usr/local/apache24/ --with-mpm-prefork
$ make
$ sudo make install

apache httpd2.4のインストールが完了しました。 次に、apacheのconfをテスト用に編集します。
/usr/local/apache24/conf/httpd.confに追記

SeverName apache-test:80
# 462行目コメント解除
Include conf/extra/httpd-mpm.conf

テスト用に子プロセスが1つしか立ち上がらないように修正します。
/usr/local/apache24/conf/extra/httpd-mpm.conf 28行目あたり

<IfModule mpm_prefork_module>
    StartServers 1
    MinSpareServers 1
    MaxSpareServers 1
    MaxRequestWorkers 1
    MaxConnectionPerChild 100
</IfModule>

コンパイル時にmpmをpreforkで指定しているのでpreforkの部分のみ書き換えます。
他のmpmを使用している場合は該当の部分を修正します。
以上でapacheの設定は完了です。
apacheを起動し、子プロセスのプロセスIDを確認しておきます。
ゲスト

# 起動
$ sudo /usr/local/apache24/bin/httpd
# プロセス確認
# 
$ ps auxf | grep httpd
root     18030  0.0  0.0  74668  2108 ?        Ss   18:26   0:00 /usr/local/apache24/bin/httpd
daemon   18031  0.0  0.0  76752  2132 ?        t    18:26   0:00  \_ /usr/local/apache24/bin/httpd

18031が子プロセスのIDです。

次にvisual studio codeの設定を行います。 C/C++プラグインを入れます。 f:id:kojima4994:20190914043209p:plain デバッグメニューからlaunch.jsonを作成し、下記の内容に編集します。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Attach",
            "type": "cppdbg",
            "request": "attach",
            "program": "/usr/local/apache24/bin/httpd",
            "processId": "18031",  // ← apacheの子プロセスID
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

デバッグメニューからアタッチを選択し、apacheの子プロセスにアタッチを行います。

アタッチされたことが確認できたらapacheへリクエストを送りデバッグすることができます。f:id:kojima4994:20190914043736p:plain