2008年11月01日

WiresharkをVC++でデバッグしてみる

PCがお手軽なプロトコルアナライザに変身するWireshark
ネットワークに関わる人なら1度は使ったことがあるはずだ。
近い将来、仕事で新しいプロトコルのアナライザが必要になりそうだったが、この手の世界で無料でお手軽に試せるようなものはない。
ないものは作ればいい、ということで、Wiresharkのプラグインとして対応することを思いついた。
私の周囲にはWindowsマシンしか使えない人が多いので、プラットフォームとしてはまずWindowsを考える。

WiresharkのWindows上でのビルドについては、ここの手順に従えばよい。
ここで不足する情報は、本家のDeveloper's Guideを読むとよい。
もともとWindows専用にデザインされたわけではないアプリケーションの場合、Windows上でビルドするのは環境をそろえるところからして非常に大変だ。
ビルド対象は、今日時点で最新リリースのWireshark-1.0.4を使う。

さてコンパイラには何を使おうか。
候補は、VC++ 2008 Express EditionかVC++ 2005 Express Editionか。
有料なツールは却下。
個人で気軽に試せないし、最近はコスト圧力が強くて会社も気前よく購入してくれない。
config.nmakeを見ると
With this variant, Wireshark will compile but fails to run!
という記述がある。
そうは言っても、VC++2005EEではPlatform SDKを別途インストールしなければいけないというところが面倒。
VC++2008EEではPlatform SDK相当が同梱されるようになったようだ。

というわけで、Wireshark本家の開発者の警告を無視し、VC++2008EEでやってみた。
config.nmakeの記述どおり、起動しない。
原因を調べるのは本筋から外れるので、VC++2005EEに切り替えてリビルドする。
今度はあっさり立ち上がる。

と、ここでデバッグはどうするのだ?という疑問が沸いて来た。
私が普段デバッグでよく使うのはgdb。
Visual Studioプロジェクトのソフトウェアをデバッグするときは、IDEからデバッグする。
ところが、前述のビルド手順では、nmakeとclを直接呼び出しているので、IDEのプロジェクトは使用していない(Wiresharkのソースコードには付属していない)。
こういう場合、どうやってデバッグすればいいのか。
もちろんgdbでもデバッグは可能だが、gcc -gでビルドしていないのでデバッグシンボルがない=ソースレベルデバッグはできない。
GUIアプリケーションをアセンブリレベルでデバッグするのは正直しんどい。
*.pdbファイルは吐き出されているから、Visual Studio用のデバッグ情報は出力されている模様。
gdbのようなコマンドラインデバッガがVC++にも付属しているかと思って調べてみたが情報が出てこない。
Wiresharkを立ち上げておいて、VC++からプロセスにアタッチすれば、もちろんアセンブリレベルでのデバッグはできるが、せっかくIDEがあるのだから、これを活用したい。
Developer's Guideにも3.7. Debug your generated Wiresharkという章はあるのだが、中身は未記載だった。

次に考えたのは、IDEにWiresharkプロジェクトをインポートする方法。
これがうまくいったので紹介しておこう。
ファイルー>既存のコードからプロジェクトを作成
プロジェクトファイルの場所には、Wiresharkのソースコードを展開した場所を選ぶ。
プロジェクト名には適当な名前をつける。
プロジェクトのビルド方法は、外部のビルドシステムを使用するをチェックする。
ビルドコマンドラインには、
--code listing--
"c:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\SetEnv.Cmd" && nmake -f Makefile.nmake
--code listing--
を指定する。
リビルドはビルドと同じコマンドを、クリーンにはdistcleanターゲットを指定すればいいと思う。
最初、Platform SDKの環境設定用のコマンドは実行していなかったのだが、
--code listing--
Makefile.namke(7) : fatal error U1052:
--code listing--
と言われてハマる。
U1052は、file not foundの意味のようだ。
Makefile.namekの7行目は、
--code listing--
include <win32.mak>
--code listing--
なので、win32.makが見つからないということだろう。
私はnmakeは書いたことがないが、<>付なので、システムとしてパスが通っていることを期待していると予想できる。
というところで、Platform SDKの環境変数が見えていないのだということに気づいた。
SetEnv.Cmdの中身を環境変数に常に展開するのは面倒だし、VC++はあまり使ったことがないので、とりあえずnmake実行時に毎回実行することにした。

さてこれでVC++ IDEからビルドする準備は整った。
プラグインの読み込みは、epan/plugins.cあたり、また、agentxプロトコルだったら、proto_register_agentxにでもブレークポイントをはれば、プラグインDLLの登録時のデバッグもできる。

posted by mign0n at 12:15| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/108908248
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック