1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

経緯

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

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

実行環境

  • Ubuntu Linux 1804 LTS (WSL2)
  • Ubuntu Linux 2004 LTS (WSL2)
  • Debian Linux 10(WSL2)

準備

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

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

gsoap のビルド

  1. gSOAP Toolkit download | SourceForge.net からソースアーカイブを取得する。

    $ wget https://jaist.dl.sourceforge.net/project/gsoap2/gsoap-2.8/gsoap_2.8.111.zip
    
  2. gsoapをビルドする。

    $ 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 のビルド

    $ cd gsoap-2.8/gsoap/src
    $ make -f MakefileManual soapcpp2
    
  2. wsdl のビルド

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

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

チュートリアルの実行

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

    $ 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 を元にソースファイルを生成

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

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

  3. calcclient.cpp の作成

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

    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 でインクルードパスを指定する派の人は、この作業は不要です。

    $ cp $HOME/gsoap-2.8/gsoap/stdsoap2.h ./
    
  5. calcclient のビルド

    $ 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 の実行

    $ ./calcclient
    Sum = 5.79
    

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

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

gsoapには、アプリビルド時にデバッグオプションを付けると、アプリが送受信するsoapメッセージログをファイルに出力してくれる機能があります(User guide - Debugging)。

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

$ 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 に出力されます。ここまでたどり着くのに丸一日かかった。。。

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

参考サイト

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?