外部インタフェース/API | ![]() ![]() |
この節では、MEX-ファイルの作成時に発生する一般的な問題に関する情報を提供します。下記の図を使って、これらの問題を別々に考えます。
図 1-1: MEX-ファイルの作成の問題のトラブルシューティング
問題1から5は、上のフローチャートの特定の場所を参照します。MEXのビルドの問題を解決するためのヒントは、MathWorks Technical Support Webサイト、http://www.mathworks.com/supportにアクセスしてください。
問題 1 - MathWorksプログラムのコンパイルの失敗
UNIXでのC MEX-ファイルの作成の最も一般的な設定の問題は、非ANSI Cコンパイラの使用や、ANSI Cコードをコンパイルすることを知らせるためのフラグをコンパイラに渡すことができないことです。
このタイプの設定の問題があるかどうかを知るための確かな方法は、The MathWorksにより提供されるヘッダファイルが、コードをコンパイルしようとするときにシンタックスエラー文字列を生成するかどうかです。適切なオプションファイルを選択するための情報、または必要ならばANSI Cコンパイラを取得するための情報は「MEX-ファイルの作成」を参照してください。
問題 2 - ユーザプログラムのコンパイルの失敗
シンタックスエラー文字列を出力する第二の場合は、ANSI Cコードと非ANSI Cコードが混在するときに起こります。The MathWorksは、ANSI C準拠のヘッダファイルとソースファイルを提供しています。従って、ユーザのCコードもANSI準拠でなければなりません。
Cプログラムで起こるその他の一般的な問題は、必要なすべてのヘッダファイルをインクルードするのを無視することや、必要なすべてのライブラリをリンクするのを無視することです。
問題 3 - MEX-ファイルのロードエラー
Unable to load mex file: ??? Invalid MEX-file
が表示された場合、MATLABはユーザのMEX-ファイルが有効であると認識できません。
MATLABは、ゲートウェイルーチンmexFunction
を探すことでMEX-ファイルをロードします。関数名のスペルを間違えた場合は、MATLABはMEX-ファイルをロードできず、エラーメッセージを表示します。Windowsでは、正確にmexFunction
を読み込んでいることをチェックしてください。
プラットフォームの中には、要求されたライブラリをリンクできない場合、MEX-ファイルをコンパイルするときでなく、MEX-ファイルをロードするときにエラーが発生することがあります。そのような場合、"unresolved symbols"または"unresolved references"というシステムエラーメッセージが表示されます。関数を定義するライブラリをリンクしていることを確かめてください。
Windowsでは、MATLABはMEX-ファイルで参照されるすべてのDLLを見つけることができない場合、MEX-ファイルをロードできません。DLLは、パス上またはMEX-ファイルと同じディレクトリになければなりません。これは、サードパーティのDLLに対しても同様です。
問題 4 - Segmentation FaultまたはBus Error
MEX-ファイルがsegmentation violationまたはバスエラーを起こす場合、プロテクトされていて、リードオンリーかまたは割り当てをされていないメモリに、MEX-ファイルがアクセスしようとしたことを意味します。これは一般的なプログラミングエラーなので、このような問題はしばしば解決が困難です。
Segmentation violationsは、常にそれらの原因となる論理エラーと同じ点で起こるわけではありません。プログラムがメモリの意図しない部分にデータを書き出す場合、プログラムがデータを読み込んで解釈するまでエラーは起こりません。従って、segmentation violationまたはバスエラーは、MEX-ファイルが実行を終了した後に起こります。
MATLABは、この現象のトラブルシューティングの手助けとして、3つの機能を提供します。以下に簡単な順に説明します。
mex
スクリプトのフラグ-argcheck
を使って再コンパイルすることで、MEX-ファイルにエラーチェックのレイヤーを追加できます。これは、MATLAB MEX-ファイル(mex
) と行列のアクセス(mx
) のAPI関数の両方に無効な引数について警告します。この場合、MEX-ファイルは効率的に実行されませんが、このスイッチによりAPI関数へnull
ポインタを渡すようなエラーを検出します。
-check_malloc
は、MATLABがメモリのチェックの情報を保持することを意味します。メモリが開放されるとき、MATLABはこのメモリの前後のメモリが書き込まれていないことと、メモリが以前に開放されていないことを確かめます。.エラーが起こる場合、MATLABは割り当てられたメモリブロックのサイズを記録します。この情報を使って、このメモリの割り当てられたコードを追跡して、続けることができます。
このフラグを使うとMATLABは効率的に実行することができませんが、配列の末尾の後に書き込んだり、以前に開放したメモリを開放するエラーを検出します。
問題 5 - プログラムが間違った結果を生成する
プログラムが間違った答えを出力する場合、いくつかの原因があります。第一に、計算ロジックでのエラーがあります。第二に、プログラムがメモリの初期化されていない部分から読み込まれている可能性があります。たとえば、10要素のベクトルの11要素目を読み込むと、予期しない結果になります。
その他の可能性は、メモリの間違ったハンドリングによる有効なデータの上書きによるものです。たとえば、10要素のベクトルの15要素目に書き込むと、メモリ内の隣接する変数のデータを上書きします。この場合、問題4で説明したsegmentation violationsと同様の方法で扱われます。
これらのすべての場合で、mexPrintf
を使って中間のステージでデータ値を調べたり、デバッガが提供するすべてのツールを利用してデバッガ内でMATLABを実行することができます。
![]() | トラブルシューティング | コンパイラとプラットフォーム固有の問題 | ![]() |