2013-12-04

「指定されたプロシージャが見つかりません。」の調べ方(Dependency Walker編)

GNOME Advent Calendar 2013 の4日目の記事です。

今回は、WindowsでGNOMEライブラリーを使おうとしたときに、

「127: 指定されたプロシージャが見つかりません。」

というエラーが発生したときの調査方法を紹介します。このエラーだけだと
何が悪いのか全くわからないので、もう少し情報を得る必要があります。

GNOMEライブラリーはC言語で書かれているので、実行時にはコンパイルと
リンクがされた状態になっています。このままではエラーの原因を見つけるのは
難しいので、内容を見やすい形で出力します。そのためのツールはいくつか
ありますが、ここではGUIツールの「Dependency Walker」を使います。

Dependency Walker (depends.exe) Home Page

Dependency Walkerは、Windows用のモジュール(.exeや.dllなど)を解析して、
含まれているモジュールや関数をツリー化して見やすく表示してくれます。

使い方の大まかな流れは、

  1. 調査するモジュールを開く
  2. 依存するモジュールのパスを登録する
  3. 足りないモジュールや関数を探す

という感じです。

それでは、具体的に見ていきます。

1. 調査するモジュールを開く

メニューバー > File か、ドラッグ&ドロップで簡単に開けます。
ここで黄色い「?」マークが表示された場合、依存するモジュールのパスが
登録されていない可能性が高いです。

2. 依存するモジュールのパスを登録する

単体で動作するモジュールなら、単純に開けばよいのですが、
他のモジュールに依存している場合、パスを登録する必要があります。
まず、メニューバー > Options > Configure Module Search Order...
で設定ウィンドウを開きます。

追加方法は、1つずつ追加する方法と、ファイルから読み込む方法があります。

1つずつ追加する場合、下のテキストボックスにパスを設定して、
左下の「Add Directory」ボタンを押します。

ファイルから読み込む場合、右側の「Load」ボタンからファイルを選択します。
一度「Save」で出力してみると、どんな風に書くかわかります。

例えば、Ruby-GNOME2プロジェクトのPangoライブラリーのpango.soの
依存関係を調査したい場合、以下のようなファイルを読み込むとよいです。

PangoはGLibとcairoを使っているので、それらのDLLファイルなどが含まれた
ディレクトリを指定します。

最後に「OK」ボタンを押せば、一覧が更新されるはずです。

3. 足りないモジュールや関数を探す

黄色い「?」マークがなくなったら準備完了なので、調査を開始します。

探し方は、まず左上のツリーで赤くなっているモジュールを探します。
それをクリックすると、右上に含まれている関数が表示されるので、
その中のどの関数に問題があるか(赤くなっているか)を調べます。

ここまで調べられれば、モジュールの開発者に報告するなり、
Googleで関数名を検索するなりして対応できそうな気がします。

(もし「?」マークがなくならなかったら、そのモジュールが足りないということです。)

まとめ

Dependency Walkerというツールを使って、コンパイル&リンク済みの
Windows用モジュールの問題を調査する方法を説明しました。

ログが何も出ないエラーが発生すると途方に暮れてしまいがちですが、
少しでも手がかりが見つかると楽しくなってくる(場合もある)ので、
ぜひ挑戦してみてください。