Troubleshooting FreeRTOS SDK

Using the PUBNUB_ASSERT subsystem

The PUBNUB_ASSERT subsystem helps you catch and fix bugs when working with the FreeRTOS SDK.

When your code hits an unexpected condition, assertions immediately flag the problem and show exactly which file and line caused the error. You can control how strict these checks are - use more checks during development to catch more issues, or fewer checks in production for better performance.

C-core has its own ASSERT module/subsystem. It's interface is in the header pubnub_assert.h. It is used in C-core modules themselves, but you can also use it in your code if you wish. It provides several levels of ASSERTs:

LevelPreprocessor SymbolDescription
highest
PUBNUB_ASSERT_LEVEL_EX
All checks enabled (compiled).
regular
PUBNUB_ASSERT_LEVEL
Only the long lasting checks are disabled, other are compiled.
lowest
PUBNUB_ASSERT_LEVEL_OPT
Only the checks with negligible execution length are enabled.
none
PUBNUB_ASSERT_LEVEL_NONE
All checks disabled.

The default level is regular, and that is the level used in our samples.

So, if you want the highest level for troubleshooting, define PUBNUB_ASSERT_LEVEL_EXpreprocessor symbol when compiling. Also, if you want to troubleshoot performance by disabling checks, define PUBNUB_ASSERT_LEVEL_NONE.

Also, you can control what happens when an assertion fails. To do that, you set a callback function to be called, by using pubnub_assert_set_handler(), which should be called as early as possible in the execution of your program.

There are a few ready-made handlers which you can use and the default is pubnub_assert_handler_abort, which provides a similar operation as the C standard assert() macro - prints a report of the place and expression of the assertion and then aborts. These handlers use the FreeRTOS_printf macro, which is not part of FreeRTOS "proper", so it might not be available in your configuration.

If you wish to provide your own handler, you need to define a function that conforms to the following typedef:

typedef void (*pubnub_assert_handler_t)(char const *s, char const *file, long line);

For example:

void dbg_break_assert_handler(char const *s, char const *file, long line)
{
FreeRTOS_printf(("Will hit breakpoint for '%s' in %s line %d\n", s, file, line));
BREAK_IN_DEBUGGER; /* assuming you have such a macro */
}
Last updated on