gsoap チュートリアルでデバッグ機能の確認

# 経緯

gsoap を利用した C++ アプリを、デバッグ機能を有効にしてビルドした際、いくつかの関数でリンクエラーが発生し、aptでインストールできるgsoap系の全ライブラリ（といっても5個ぐらいのはず）をリンクオプションに設定してみたが解決できなかったので、チュートリアルに立ち戻ってみました。

# gsoap チュートリアル関連サイト

- [Getting Started with gSOAP](https://www.genivia.com/dev.html)
- [gSOAP Tutorials](https://www.genivia.com/tutorials.html)

# 実行環境

- Ubuntu Linux 1804 LTS (WSL2)
- Ubuntu Linux 2004 LTS (WSL2)
- Debian Linux 10（WSL2）


# 準備

## 必用そうなパッケージのインストール

```bash
$ sudo apt install build-essential unzip \
    libssl-dev zlib1g-dev bison++ flex flexc++
```


## gsoap のビルド

1. [gSOAP Toolkit download | SourceForge.net](https://sourceforge.net/projects/gsoap2/) からソースアーカイブを取得する。

    ```bash
    $ wget https://jaist.dl.sourceforge.net/project/gsoap2/gsoap-2.8/gsoap_2.8.111.zip
    ```

2. gsoapをビルドする。

    ```bash
    $ unzip gsoap_2.8.111.zip
    $ cd gsoap-2.8
    $ ./configure
    $ make
    $ make install
    ```

そして、Ubuntu Linux 1804では失敗します。。。  
原因は ~~追いたくない~~ 不明ですが、Debian10、Ubuntu Linux 2004 だと問題ないので、gsoapのバージョンをさかのぼっていけば、Ubuntu Linux 1804でもビルド成功にたどり着けるかもです。  
ここは、今回の本題ではないので、気にせずスルーです。


## gsoap ツールを個別ビルドする

ビルドしたバイナリは `gsoap-2.8/gsoap/bin` に格納されます。

1. soapcpp2 のビルド

    ```bash
    $ cd gsoap-2.8/gsoap/src
    $ make -f MakefileManual soapcpp2
    ```

2. wsdl のビルド

    ```bash
    $ cd gsoap-2.8/gsoap/wsdl
    $ make -f MakefileManual secure
    ```

    SSLを使わない場合は「secure」を除外します。


# チュートリアルの実行

1. チュートリアルサンプル `calc.h` の生成

    ```bash
    $ mkdir $HOME/tutorial
    $ cd $HOME/tutorial
    $ $HOME/gsoap-2.8/gsoap/bin/wsdl2h -o calc.h http://www.genivia.com/calc.wsdl
    ```

    `ls` を実行すると、カレントディレクトリに `calc.h` が生成されます。

2. `calc.h` を元にソースファイルを生成

    ```bash
    $ $HOME/gsoap-2.8/gsoap/bin/soapcpp2 -j -CL -I$HOME/gsoap-2.8/gsoap/import calc.h
    ```

    `ls` を実行すると、カレントディレクトリにいろいろなファイルが生成されます。

3. `calcclient.cpp` の作成

    ツールで生成したファイルには `main` 関数が無いので、`main` 関数を準備します。

    ```cpp:calcclient.cpp
    #include "calc.nsmap"
    #include "soapcalcProxy.h"

    int main()
    {
        calcProxy calc;
        double sum;
        if (calc.add(1.23, 4.56, sum) == SOAP_OK)
            std::cout << "Sum = " << sum << std::endl;
        else
            calc.soap_stream_fault(std::cerr);
        calc.destroy(); // same as: soap_destroy(calc.soap); soap_end(calc.soap);
    }
    ```

4. stdsoap2.h のコピー

    `stdsoap2.cpp` の `#include "stdsoap2.h"` の関係で、カレントディレクトリに `stdsoap2.h` をコピーしておきます。  
    ビルドする時に `-I` でインクルードパスを指定する派の人は、この作業は不要です。

    ```bash
    $ cp $HOME/gsoap-2.8/gsoap/stdsoap2.h ./
    ```

5. calcclient のビルド

    ```bash
    $ c++ -o calcclient calcclient.cpp soapC.cpp soapcalcProxy.cpp \
        $HOME/gsoap-2.8/gsoap/stdsoap2.cpp
    ```

    4 を省略した場合は、

    ```
    $ c++ -o calcclient \
        -I$HOME/gsoap-2.8/gsoap/ \
        calcclient.cpp soapC.cpp soapcalcProxy.cpp $HOME/gsoap-2.8/gsoap/stdsoap2.cpp
    ```

6. calcclient の実行

    ```bash
    $ ./calcclient
    Sum = 5.79
    ```


で、ここからが本題です。

# gsoap のデバッグ機能を有効にする

gsoapには、アプリビルド時にデバッグオプションを付けると、アプリが送受信するsoapメッセージログをファイルに出力してくれる機能があります（[User guide - Debugging](https://www.genivia.com/doc/guide/html/index.html#debugging)）。  

やり方は、下記のように、コンパイルオプションに `-DDEBUG` を付けるだけです。

```bash
$ c++ -o calcclient \
    -DDEBUG \
    -I$HOME/gsoap-2.8/gsoap/ \
    calcclient.cpp soapC.cpp soapcalcProxy.cpp $HOME/gsoap-2.8/gsoap/stdsoap2.cpp
```

デバッグオプションを有効にすると、アプリが送受信する soap メッセージが RECV.log／SENT.log に出力されます。また、送受信内部処理ログっぽいものが TEST.log に出力されます。ここまでたどり着くのに丸一日かかった。。。  

アプリの挙動がログファイルで確認できるメリットはありますが、常にファイルアクセスが発生するので性能が低下するのと、長時間運用するとディスク容量が圧迫されるので注意が必要です。


# 参考サイト

- [LINUX WEBSERVICE GSOAPチュートリアル（1）](https://programmerstart.com/article/1767188119/)  
  海外サイトの日本語機械翻訳サイト？な感じで、ところどころ単語が欠落していました。