|
#define | DBG errfile = __FILE__, errline = __LINE__, elinks_debug |
| DBG(format_string) is used for printing of debugging information.
|
#define | WDBG errfile = __FILE__, errline = __LINE__, elinks_wdebug |
| WDBG(format_string) is used for printing of debugging information, akin to DBG().
|
#define | ERROR errfile = __FILE__, errline = __LINE__, elinks_error |
| ERROR(format_string) is used to report non-fatal unexpected errors during the ELinks run.
|
#define | INTERNAL errfile = __FILE__, errline = __LINE__, elinks_internal |
| INTERNAL(format_string) is used to report fatal errors during the ELinks run.
|
#define | LOG_ERR(args...) |
#define | LOG_WARN(args...) |
#define | LOG_INFO(args...) |
#define | LOG_DBG(args...) |
#define | assert(x) |
| This is our smart assert().
|
#define | assertm(x, m...) |
| This is extended assert() version, it can print additional user-specified message.
|
#define | if_assert_failed if (assert_failed && !(assert_failed = 0)) |
#define | do_not_optimize_here_gcc_2_7(x) |
#define | do_not_optimize_here_gcc_3_x(x) |
#define | do_not_optimize_here_gcc_3_3(x) |
|
void | elinks_debug (const char *fmt,...) |
void | elinks_wdebug (const char *fmt,...) |
void | elinks_error (const char *fmt,...) |
void | elinks_internal (const char *fmt,...) |
void | usrerror (const char *fmt,...) |
| usrerror(format_string) is used to report user errors during a peaceful ELinks run.
|
void | elinks_log (char *msg, char *file, int line, const char *fmt,...) |
| The LOG_* () macros can be used to log to a file, however, by default log messages are written to stderr.
|
void | force_dump (void) |
| This will print some fancy message, version string and possibly do something else useful.
|
void | do_not_optimize_here (void *x) |
| This function does nothing, except making compiler not to optimize certains spots of code — this is useful when that particular optimization is buggy.
|
Error handling and debugging stuff.
Here you will found a chunk of functions useful for error states — from reporting of various problems to generic error tests/workarounds to some tools to be used when you got into an error state already. Some of the functions are also useful for debugging.
#define assertm |
( |
| x, |
|
|
| m... ) |
Value:
INTERNAL("assertion " #x " failed: " m); \
} } while (0)
This is extended assert() version, it can print additional user-specified message.
Quite useful not only to detect that something is wrong, but also how wrong is it ;-). Note that the format string must always be a regular string, not a variable reference. Also, be careful what will you attempt to print, or you could easily get just a SIGSEGV instead of the assertion failed message.
Whether an assertion has failed and the failure has not yet been handled.
To make recovery path possible (assertion failed may not mean end of the world, the execution goes on if we're outside of CONFIG_DEBUG and CONFIG_FASTMEM), assert_failed
is set to true if the last assert() failed, otherwise it's zero. Note that you must never change assert_failed value, sorry guys.
You should never test assert_failed
directly anyway. Use if_assert_failed instead, it will attempt to hint compiler to optimize out the recovery path if we're CONFIG_FASTMEM. So it should go like:
assertm(1 == 1,
"The world's gonna blow up!");
#define if_assert_failed
Definition error.h:193
#define assertm(x, m...)
This is extended assert() version, it can print additional user-specified message.
Definition error.h:129
In-depth explanation: this restriction is here because in the CONFIG_FASTMEM mode, assert_failed
is initially initialized to zero and then not ever touched anymore. So if you change it to non-zero failure, your all further recovery paths will get hit (and since developers usually don't test CONFIG_FASTMEM mode extensively...). So better don't mess with it, even if you would do that with awareness of this fact. We don't want to iterate over tens of spots all over the code when we change one detail regarding CONFIG_FASTMEM operation.
This is not that actual after introduction of if_assert_failed, but it's a safe recommendation anyway, so... ;-)
char full_static_version[1024] |
|
extern |
This function dumps backtrace (or whatever similar it founds on the stack) nicely formatted and with symbols resolved to f.
When trouble is set, it tells it to be extremely careful and not use dynamic memory allocation functions etc (useful in SIGSEGV handler etc).
Note that this function just calls system-specific backend provided by the libc, so it is available only on some systems. CONFIG_BACKTRACE is defined if it is available on yours. This is needed for providing info about features when dumping core