Guy on Simulink

Simulink & Model-Based Design

Debugging C/C++ S-Functions 8

Posted by Guy Rouleau,

If you are going to work with C or C++ S-Functions, you will probably need to do some debugging.

My advice is: Don't go with the printf debugging approach. I did that for too long and now I realize it was a waste of my time. Once you discover how simple and more efficient it is to use an actual debugger when developing C Mex S-Functions, you will never go back.

This week I want to show how easy it is to attach an external debugger to MATLAB and debug s-functions. The following is an adaptation for C-Mex S-functions of the MATLAB documentation page Debug C/C++ Language MEX-Files.

Setting up the compiler

To begin, you need a development environment that provides source code debugging. In this post, I will use Microsoft Visual Studio 2010 Express on the Windows operating system and GDB, the GNU Project debugger, on Linux.

Once your compiler is installed, you need to select it using:

mex -setup

Compiling with debug symbols

You need to compile the S-function source file with the -g option, which builds the file with debugging symbols. For example:

mex -g timestwo.c

On Windows, you will see an additional PDB file containing the debug symbols:

PDB file continaing debug symbols

Attaching to the MATLAB process in Visual Studio

In Visual Studio, go to the Tools menu to attach to the MATLAB process:

Attaching a process in Visual Studio.
***If you do not see the Attach to Process option, enable Expert Settings by going to: "Tools -> Settings -> Expert settings".

This will launch a window where you can select MATLAB.exe and click Attach.

Add Breakpoints

Open the source file of your S-function in Visual Studio and set some breakpoints:

Add Breakpoints

Attaching to the MATLAB process using GDB

If you are a Linux user, you have many options to debug your S-Function. I will show you the one I typically use.

First, launch a terminal and identify the MATLAB process ID using a line like:

get Process ID

Then launch GDB by typing gdb in the terminal.

In GDB, the first thing you do is to attach to the MATLAB process. For the example above, you would type:

attach 8736

Once GDB is attached to the MATLAB process, you can set breakpoints and watchpoints, for example:

break timestwo.c:mdlOutputs

Finally, restore the execution of MATLAB by executing:



Whether you are on Linux or Windows, hit play in your model. The focus should automatically go to the debugger as soon as a breakpoint is reached. From here, consult the documentation of your debugger on how to take advantage of its specific features.

Only for Debugging

It might seems strange to have to say this, but a debugging process like this should only be done when you are investigating a problem. When debugging you have access to the inner workings of a running program. It is possible to use the debugger in such a way as to corrupt that session of MATLAB and Simulink. For this reason, only use this process when you are debugging.

Now it's your turn

How do you debug your S-Functions? Please share with us your tips and tricks by leaving a comment here

8 CommentsOldest to Newest

Brian Harries replied on : 3 of 8

Is there any way to debug using GDB on windows? I have been able to compile for GDB and I can set break points but I can not attach GDB to a Matlab process on windows. Any help would be greatly appreciated.


I am using MSVC++ 2010 express version and It's not working for me,, ..the symbols are not loaded . does it supports for express 2010 version?? replied on : 4 of 8

please reply

Amjad Elshenawy replied on : 5 of 8

Regarding the error message “The breakpoint will not currently be hit. No symbols have been loaded for this document”, it was solved by going to “Attach to Prcess” and changing the “Attach to” field to be “Native Code” (MSVC++ 2013)

Best regards

KaKa replied on : 6 of 8

Hi Guy Rouleau,
I have two S-function blocks, but I want to exchange variables between them, via external functions (.c, .h file), How I can do that? thank you!

Guy Rouleau replied on : 7 of 8

@KaKa: I recommend avoiding having two separate S-Function exchanging varaibles. If you find a way to do so, the results might become undeterministic and difficult to interpret. I recommend using signal lines between the two S-Functions, or at least Data Store Memory blocks connected to the inputs and outputs of your blocks.

Patrick replied on : 8 of 8

Hi Guy,
Thanks for the article. Is there a way to debug a sim running in Rapid Accelerator mode? I have a sim that will run just fine in Accelerator mode, but causes a SIGFPE (Floating Point Exception) error when running in raccel. Since raccel compiles the sim into a standalone program and runs it in a new thread (or process?), I’m having trouble figuring out how to get GDB to break on the exception.


Add A Comment

What is 1 + 10?

Preview: hide