MySQL 9.4.0
Source Code Documentation
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
gcs_debug.h
Go to the documentation of this file.
1/* Copyright (c) 2016, 2025, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is designed to work with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23
24#ifndef GCS_DEBUG_H
25#define GCS_DEBUG_H
26
27#include "xcom/xcom_common.h"
28
29#include "xcom/x_platform.h"
30
31#ifdef TASK_DBUG_ON
32#error "TASK_DBUG_ON already defined"
33#else
34#define TASK_DBUG_ON 0
35#endif
36
37#include "xcom/xcom_externals.h"
38
39#define TX_FMT "{" SY_FMT_DEF " %" PRIu32 "}"
40#define TX_MEM(x) SY_MEM((x).cfg), (x).pc
41
42#include <stdio.h>
43#include <stdlib.h>
44
45double task_now();
46
47#ifdef DBGOUT
48#error "DBGOUT defined"
49#endif
50
51#include "xcom/xcom_logger.h"
52
53#ifndef XCOM_STANDALONE
54#include "my_compiler.h"
55#endif
56
57/**
58 Callbacks used in the logging macros.
59*/
60
64
65/**
66 Define the set of debug and trace options that are enabled if there
67 is no debugger check injected.
68*/
69extern int64_t xcom_debug_options;
70
71/**
72 Concatenates two strings and returns pointer to last character of final
73 string, allowing further concatenations without having to cycle through the
74 entire string again.
75
76 @param dest pointer to last character of destination string
77 @param size pointer to the number of characters currently added to
78 xcom_log_buffer
79 @param src pointer to the string to append to dest
80 @return pointer to the last character of destination string after appending
81 dest, which corresponds to the position of the '\0' character
82*/
83
84char *mystrcat(char *dest, int *size, const char *src);
85
86/**
87 This function allocates a new string where the format string and optional
88 arguments are rendered to.
89 Finally, it invokes mystr_cat to concatenate the rendered string to the
90 string received in the first parameter.
91*/
92
93char *mystrcat_sprintf(char *dest, int *size, const char *format, ...)
94 MY_ATTRIBUTE((format(printf, 3, 4)));
95
96#define STR_SIZE 2047
97
98#define GET_GOUT \
99 char xcom_log_buffer[STR_SIZE + 1]; \
100 char *xcom_temp_buf = xcom_log_buffer; \
101 int xcom_log_buffer_size = 0; \
102 xcom_log_buffer[0] = 0
103#define GET_NEW_GOUT \
104 char *xcom_log_buffer = (char *)malloc((STR_SIZE + 1) * sizeof(char)); \
105 char *xcom_temp_buf = xcom_log_buffer; \
106 int xcom_log_buffer_size = 0; \
107 xcom_log_buffer[0] = 0
108#define FREE_GOUT xcom_log_buffer[0] = 0
109#define ADD_GOUT(s) \
110 xcom_temp_buf = mystrcat(xcom_temp_buf, &xcom_log_buffer_size, s)
111#define COPY_AND_FREE_GOUT(s) \
112 { \
113 char *__funny = s; \
114 ADD_GOUT(__funny); \
115 free(__funny); \
116 }
117#define ADD_F_GOUT(...) \
118 xcom_temp_buf = \
119 mystrcat_sprintf(xcom_temp_buf, &xcom_log_buffer_size, __VA_ARGS__)
120#define PRINT_LOUT(level) xcom_log(level, xcom_log_buffer)
121#define PRINT_GOUT xcom_debug("%s", xcom_log_buffer)
122#define RET_GOUT return xcom_log_buffer
123
124#define G_LOG_LEVEL(level, ...) \
125 { \
126 GET_GOUT; \
127 ADD_F_GOUT(__VA_ARGS__); \
128 PRINT_LOUT(level); \
129 FREE_GOUT; \
130 }
131
132#ifndef XCOM_STANDALONE
133#define G_DEBUG_LEVEL(level, ...) \
134 { \
135 if (IS_XCOM_DEBUG_WITH(level)) { \
136 xcom_debug(__VA_ARGS__); \
137 } \
138 }
139#else
140#define G_DEBUG_LEVEL(level, ...) \
141 { \
142 if (IS_XCOM_DEBUG_WITH(level)) { \
143 GET_GOUT; \
144 ADD_F_GOUT(__VA_ARGS__); \
145 PRINT_GOUT; \
146 FREE_GOUT; \
147 } \
148 }
149#endif /* XCOM_STANDALONE */
150
151#define G_FATAL(...) G_LOG_LEVEL(XCOM_LOG_FATAL, __VA_ARGS__)
152#define G_ERROR(...) G_LOG_LEVEL(XCOM_LOG_ERROR, __VA_ARGS__)
153#define G_WARNING(...) G_LOG_LEVEL(XCOM_LOG_WARN, __VA_ARGS__)
154#define G_INFO(...) G_LOG_LEVEL(XCOM_LOG_INFO, __VA_ARGS__)
155#define G_DEBUG(...) \
156 G_DEBUG_LEVEL(XCOM_DEBUG_BASIC | XCOM_DEBUG_TRACE, __VA_ARGS__)
157#define G_TRACE(...) G_DEBUG_LEVEL(XCOM_DEBUG_TRACE, __VA_ARGS__)
158#define IS_XCOM_DEBUG_WITH(level) xcom_debug_check(level)
159
160#ifdef IDENTIFY
161#error "IDENTIFY already defined!"
162#else
163#define IDENTIFY
164#endif
165
166#ifdef DBG_IDENTIFY
167#error "DBG_IDENTIFY already defined!"
168#else
169#define DBG_IDENTIFY
170#endif
171
172#define BIT(n) (1L << n)
173
178 D_FSM = BIT(2),
183 D_XDR = BIT(7),
190 D_CONS = BIT(14),
191 D_BUG = ~0L
194
195enum { DBG_STACK_SIZE = 256 };
196extern long xcom_debug_mask;
197extern long xcom_dbg_stack[DBG_STACK_SIZE];
198extern int xcom_dbg_stack_top;
199
200static inline int do_dbg(xcom_dbg_type x) { return (x & xcom_debug_mask) != 0; }
201static inline void set_dbg(xcom_dbg_type x) { xcom_debug_mask |= x; }
202static inline void unset_dbg(xcom_dbg_type x) { xcom_debug_mask &= ~x; }
203static inline long get_dbg() { return xcom_debug_mask; }
204
205static inline void push_dbg(long x) {
209 xcom_debug_mask = x;
210 }
211}
212
213static inline void pop_dbg() {
214 if (xcom_dbg_stack_top > 0) {
217 }
218}
219
220#ifdef INFO
221#error "INFO already defined!"
222#else
223#define INFO(x) \
224 do { \
225 GET_GOUT; \
226 ADD_F_GOUT("%f ", task_now()); \
227 x; \
228 PRINT_LOUT(XCOM_LOG_INFO); \
229 FREE_GOUT; \
230 } while (0)
231#endif
232
233#if TASK_DBUG_ON
234
235#define DBGOUT(x) \
236 do { \
237 if (IS_XCOM_DEBUG_WITH(XCOM_DEBUG_TRACE)) { \
238 GET_GOUT; \
239 ADD_F_GOUT("%f ", task_now()); \
240 x; \
241 PRINT_GOUT; \
242 FREE_GOUT; \
243 } \
244 } while (0)
245#define NEW_DBG(x) \
246 long dbg_save = get_dbg(); \
247 set_dbg(x)
248#define RESTORE_DBG set_dbg(dbg_save)
249
250#ifdef IFDBG
251#error "IFDBG already defined!"
252#else
253#define IFDBG(mask, body) \
254 { \
255 if (do_dbg(mask)) DBGOUT(body); \
256 }
257#endif
258
259#ifdef DBGOUT_ASSERT
260#error "DBGOUT_ASSERT already defined"
261#else
262#define DBGOUT_ASSERT(expr, dbginfo) \
263 if (!(expr)) { \
264 GET_GOUT; \
265 FN; \
266 dbginfo; \
267 PRINT_LOUT(XCOM_LOG_ERROR); \
268 FREE_GOUT; \
269 abort(); \
270 }
271#endif
272
273#else
274
275#define DBGOUT(x) \
276 do { \
277 } while (0)
278#define DBGOUT_ASSERT(expr, dbginfo)
279#define NEW_DBG(x)
280#define IFDBG(mask, body)
281#endif
282
283#include <sys/types.h>
284#ifndef _WIN32
285#include <unistd.h>
286#endif
287
288static inline int xpid() {
289 static int pid = 0;
290 if (!pid) pid = getpid();
291 return pid;
292}
293
294#ifdef _WIN32
295static inline char const *fixpath(char const *x) {
296 char const *s = strrchr(x, '\\');
297 return s ? s + 1 : x;
298}
299#else
300static inline char const *fixpath(char const *x) {
301 char const *s = strrchr(x, '/');
302 return s ? s + 1 : x;
303}
304#endif
305
306extern uint32_t get_my_xcom_id();
307
308#define XDBG #error
309#define FN \
310 ADD_GOUT(__func__); \
311 ADD_F_GOUT(" pid %d xcom_id %x %s:%d ", xpid(), get_my_xcom_id(), \
312 fixpath(__FILE__), __LINE__)
313#define PTREXP(x) ADD_F_GOUT(#x ": %p ", (void const *)(x))
314#define CONSTPTREXP(x) PTREXP(x)
315#define PPUT(x) ADD_F_GOUT("0x%p ", (void *)(x))
316#define STREXP(x) ADD_F_GOUT(#x ": %s ", x)
317#define STRLIT(x) ADD_GOUT(x)
318#define NPUT(x, f) ADD_F_GOUT("%" #f " ", x)
319#define NDBG(x, f) \
320 ADD_F_GOUT(#x " = "); \
321 NPUT(x, f)
322#define NDBG64(x) \
323 ADD_F_GOUT(#x " = "); \
324 NPUT64(x);
325#define NPUT64(x) ADD_F_GOUT("%" PRIu64 " ", x)
326#define NEXP(x, f) ADD_F_GOUT(#x ": %" #f " ", x)
327#define NUMEXP(x) NEXP(x, d)
328#define LOUT(pri, x) ADD_F_GOUT(x);
329#define SYCEXP(exp) \
330 ADD_F_GOUT(#exp "={%x %" PRIu64 " %u} ", (exp).group_id, ((exp).msgno), \
331 ((exp).node))
332#define TIDCEXP(exp) \
333 ADD_F_GOUT(#exp "={%x %" PRIu64 " %u %u} ", (exp).cfg.group_id, \
334 (exp).cfg.msgno, (exp).cfg.node, (exp).pc)
335#define TIMECEXP(exp) ADD_F_GOUT(#exp "=%f sec ", (exp))
336#define BALCEXP(exp) ADD_F_GOUT(#exp "={%d %d} ", (exp).cnt, (exp).node)
337
338#endif /* GCS_DEBUG_H */
#define L
Definition: ctype-tis620.cc:74
static int xpid()
Definition: gcs_debug.h:288
uint32_t get_my_xcom_id()
Definition: xcom_base.cc:442
static long get_dbg()
Definition: gcs_debug.h:203
xcom_debugger xcom_debug
Definition: xcom_interface.cc:102
#define BIT(n)
Definition: gcs_debug.h:172
static char const * fixpath(char const *x)
Definition: gcs_debug.h:300
char * mystrcat_sprintf(char *dest, int *size, const char *format,...)
This function allocates a new string where the format string and optional arguments are rendered to.
Definition: task_debug.cc:78
static void set_dbg(xcom_dbg_type x)
Definition: gcs_debug.h:201
xcom_debugger_check xcom_debug_check
Definition: xcom_interface.cc:103
xcom_dbg_type
Definition: gcs_debug.h:174
@ D_TRANSPORT
Definition: gcs_debug.h:179
@ D_PROPOSE
Definition: gcs_debug.h:180
@ D_ALLOC
Definition: gcs_debug.h:187
@ D_STORE
Definition: gcs_debug.h:184
@ D_FSM
Definition: gcs_debug.h:178
@ D_BUG
Definition: gcs_debug.h:191
@ D_DETECT
Definition: gcs_debug.h:186
@ D_DISPATCH
Definition: gcs_debug.h:181
@ D_XDR
Definition: gcs_debug.h:183
@ D_EXEC
Definition: gcs_debug.h:185
@ D_SEMA
Definition: gcs_debug.h:182
@ D_CONS
Definition: gcs_debug.h:190
@ D_BASE
Definition: gcs_debug.h:177
@ D_NONE
Definition: gcs_debug.h:175
@ D_FILEOP
Definition: gcs_debug.h:188
@ D_CACHE
Definition: gcs_debug.h:189
@ D_TASK
Definition: gcs_debug.h:176
int64_t xcom_debug_options
Define the set of debug and trace options that are enabled if there is no debugger check injected.
Definition: xcom_interface.cc:104
char * mystrcat(char *dest, int *size, const char *src)
Concatenates two strings and returns pointer to last character of final string, allowing further conc...
Definition: task_debug.cc:38
long xcom_dbg_stack[DBG_STACK_SIZE]
Definition: xcom_base.cc:416
int xcom_dbg_stack_top
Definition: xcom_base.cc:417
static void unset_dbg(xcom_dbg_type x)
Definition: gcs_debug.h:202
@ DBG_STACK_SIZE
Definition: gcs_debug.h:195
long xcom_debug_mask
Definition: xcom_base.cc:414
static void pop_dbg()
Definition: gcs_debug.h:213
double task_now()
Definition: task.cc:322
static void push_dbg(long x)
Definition: gcs_debug.h:205
xcom_logger xcom_log
Callbacks used in the logging macros.
Definition: xcom_interface.cc:101
static int do_dbg(xcom_dbg_type x)
Definition: gcs_debug.h:200
Header for compiler-dependent features.
std::string format(const routing_guidelines::Session_info &session_info, bool extended_session_info)
Definition: dest_metadata_cache.cc:170
size_t size(const char *const c)
Definition: base64.h:46
int(* xcom_debugger_check)(const int64_t debug_options)
Definition: xcom_logger.h:79
void(* xcom_debugger)(const char *format,...)
Definition: xcom_logger.h:77
void(* xcom_logger)(const int64_t level, const char *message)
Definition: xcom_logger.h:76