]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: tools: make fddebug() automatically emit the location
authorWilly Tarreau <w@1wt.eu>
Mon, 9 Dec 2024 16:40:51 +0000 (17:40 +0100)
committerWilly Tarreau <w@1wt.eu>
Mon, 9 Dec 2024 17:05:09 +0000 (18:05 +0100)
fddebug() is sometimes quite helpful, but annoying to use when following
a call path because it's a pain to always repeat the function name and
call place. Let's have it automatically prepend the function name, the
file name and the line number, and make its arguments optional, replacing
them by a simple LF when all absent. This way, simply placing:

    fddebug();

is sufficient to emit a location follocing "[%s@%s:%d]\n". This function
must not be used in production (and even call places with it shouldn't be
committed) and it should only be used by developers, so the simplest the
better.

include/haproxy/tools.h

index 4f90a05ec4d1cef6fd55e33a97cccf2322466822..ef2f5c4ecf13ba833aa0eb8f3e531e444db6eb3f 100644 (file)
@@ -1028,9 +1028,27 @@ void make_word_fingerprint(uint8_t *fp, const char *word);
 int word_fingerprint_distance(const uint8_t *fp1, const uint8_t *fp2);
 
 /* debugging macro to emit messages using write() on fd #-1 so that strace sees
- * them.
- */
-#define fddebug(msg...) do { char *_m = NULL; memprintf(&_m, ##msg); if (_m) write(-1, _m, strlen(_m)); free(_m); } while (0)
+ * them. It relies on variadic macros with optional arguments so that any
+ * number of argument is accepted. If at least one argument is passed, the
+ * first one is a format string and the other ones are the arguments, exactly
+ * like printf(). The macro always prepends the function name and the location
+ * as file:line between square brackets on any line. If no format string is
+ * passed, then "\n" is used. Otherwise the caller has to deal with \n itself
+ * (format or data).
+ */
+#define fddebug(...) __fddebug(__VA_ARGS__)
+#define _fddebug(fmt, msg...) __fddebug("" ##fmt, ##msg)
+#define __fddebug(fmt, msg...) do {                                    \
+               char *_m = NULL;                                        \
+               memprintf(&_m,                                          \
+                         (""fmt)[0] ?                                  \
+                         ("[%s@%s:%d] " fmt) :                         \
+                         ("[%s@%s:%d]\n"), __func__,                   \
+                         __FILE__, __LINE__, ##msg);                   \
+               if (_m)                                                 \
+                       write(-1, _m, strlen(_m));                      \
+               free(_m);                                               \
+       } while (0)
 
 /* displays a <len> long memory block at <buf>, assuming first byte of <buf>
  * has address <baseaddr>. String <pfx> may be placed as a prefix in front of