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. 調査するモジュールを開く
メニューバー > 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用モジュールの問題を調査する方法を説明しました。
ログが何も出ないエラーが発生すると途方に暮れてしまいがちですが、
少しでも手がかりが見つかると楽しくなってくる(場合もある)ので、
ぜひ挑戦してみてください。