External Interfaces/API |
Understanding MEX-File Problems
This section contains information regarding common problems that occur when creating MEX-files. Use the figure, below, to help isolate these problems.
Figure 1-1: Troubleshooting MEX-File Creation Problems
Problems 1 through 5 refer to specific sections of the previous flowchart. For additional suggestions on resolving MEX build problems, access the MathWorks Technical Support Web site at http://www.mathworks.com/support.
Problem 1 - Compiling a MathWorks Program Fails
The most common configuration problem in creating C MEX-files on UNIX involves using a non-ANSI C compiler, or failing to pass to the compiler a flag that tells it to compile ANSI C code.
A reliable way of knowing if you have this type of configuration problem is if the header files supplied by The MathWorks generate a string of syntax errors when you try to compile your code. See Building MEX-Files for information on selecting the appropriate options file or, if necessary, obtain an ANSI C compiler.
Problem 2 - Compiling Your Own Program Fails
A second way of generating a string of syntax errors occurs when you attempt to mix ANSI and non-ANSI C code. The MathWorks provides header and source files that are ANSI C compliant. Therefore, your C code must also be ANSI compliant.
Other common problems that can occur in any C program are neglecting to include all necessary header files, or neglecting to link against all required libraries.
Problem 3 - MEX-File Load Errors
If you receive an error of the form
MATLAB is unable to recognize your MEX-file as being valid.
MATLAB loads MEX-files by looking for the gateway routine, mexFunction
. If you misspell the function name, MATLAB is not able to load your MEX-file and generates an error message. On Windows, check that you are exporting mexFunction
correctly.
On some platforms, if you fail to link against required libraries, you may get an error when MATLAB loads your MEX-file rather than when you compile your MEX-file. In such cases, you see a system error message referring to unresolved symbols or unresolved references. Be sure to link against the library that defines the function in question.
On Windows, MATLAB will fail to load MEX-files if it cannot find all DLLs referenced by the MEX-file; the DLLs must be on the path or in the same directory as the MEX-file. This is also true for third party DLLs.
Problem 4 - Segmentation Fault or Bus Error
If your MEX-file causes a segmentation violation or bus error, it means that the MEX-file has attempted to access protected, read-only, or unallocated memory. Since this is such a general category of programming errors, such problems are sometimes difficult to track down.
Segmentation violations do not always occur at the same point as the logical errors that cause them. If a program writes data to an unintended section of memory, an error may not occur until the program reads and interprets the corrupted data. Consequently, a segmentation violation or bus error can occur after the MEX-file finishes executing.
MATLAB provides three features to help you in troubleshooting problems of this nature. Listed in order of simplicity, they are:
mex
script flag -argcheck
. This warns you about invalid arguments to both MATLAB MEX-file (mex
) and matrix access (mx
) API functions.
null
pointers to API functions.
-check_malloc
, indicates that MATLAB should maintain additional memory checking information. When memory is freed, MATLAB checks to make sure that memory just before and just after this memory remains unwritten and that the memory has not been previously freed.
Although using this flag prevents MATLAB from running as efficiently as it can, it detects such errors as writing past the end of a dimensioned array, or freeing previously freed memory.
Problem 5 - Program Generates Incorrect Results
If your program generates the wrong answer(s), there are several possible causes. First, there could be an error in the computational logic. Second, the program could be reading from an uninitialized section of memory. For example, reading the 11th element of a 10-element vector yields unpredictable results.
Another possibility for generating a wrong answer could be overwriting valid data due to memory mishandling. For example, writing to the 15th element of a 10-element vector might overwrite data in the adjacent variable in memory. This case can be handled in a similar manner as segmentation violations as described in Problem 4.
In all of these cases, you can use mexPrintf
to examine data values at intermediate stages, or run MATLAB within a debugger to exploit all the tools the debugger provides.
Troubleshooting | Compiler and Platform-Specific Issues |