3 /**********************************************************************
5 vm_debug.h - YARV Debug function interface
8 created at: 04/08/25 02:33:49 JST
10 Copyright (C) 2004-2007 Koichi Sasada
12 **********************************************************************/
14 #include "ruby/ruby.h"
16 RUBY_SYMBOL_EXPORT_BEGIN
18 #define dpv(h,v) ruby_debug_print_value(-1, 0, (h), (v))
19 #define dp(v) ruby_debug_print_value(-1, 0, "", (v))
20 #define dpi(i) ruby_debug_print_id(-1, 0, "", (i))
21 #define dpn(n) ruby_debug_print_node(-1, 0, "", (n))
25 VALUE
ruby_debug_print_value(int level
, int debug_level
, const char *header
, VALUE v
);
26 void ruby_debug_print_v(VALUE v
);
27 ID
ruby_debug_print_id(int level
, int debug_level
, const char *header
, ID id
);
28 struct RNode
*ruby_debug_print_node(int level
, int debug_level
, const char *header
, const struct RNode
*node
);
29 void ruby_debug_print_n(const struct RNode
*node
);
30 int ruby_debug_print_indent(int level
, int debug_level
, int indent_level
);
31 void ruby_debug_gc_check_func(void);
32 void ruby_set_debug_option(const char *str
);
34 RUBY_SYMBOL_EXPORT_END
36 #ifndef USE_RUBY_DEBUG_LOG
37 #define USE_RUBY_DEBUG_LOG 0
40 /* RUBY_DEBUG_LOG: Logging debug information mechanism
42 * This feature provides a mechanism to store logging information
43 * to a file, stderr or memory space with simple macros.
45 * The following information will be stored.
46 * * (1) __FILE__, __LINE__ in C
47 * * (2) __FILE__, __LINE__ in Ruby
48 * * (3) __func__ in C (message title)
49 * * (4) given string with sprintf format
50 * * (5) Thread number (if multiple threads are running)
52 * This feature is enabled only USE_RUBY_DEBUG_LOG is enabled.
53 * Release version should not enable it.
55 * Running with the `RUBY_DEBUG_LOG` environment variable enables
58 * # logging into a file
59 * RUBY_DEBUG_LOG=/path/to/file STDERR
61 * # logging into STDERR
62 * RUBY_DEBUG_LOG=stderr
64 * # logging into memory space (check with a debugger)
65 * # It will help if the timing is important.
68 * RUBY_DEBUG_LOG_FILTER environment variable can specify the filter string.
69 * If "(3) __func__ in C (message title)" contains the specified string, the
70 * information will be stored (example: RUBY_DEBUG_LOG_FILTER=str will enable
71 * only on str related information).
73 * In a MRI source code, you can use the following macros:
74 * * RUBY_DEBUG_LOG(fmt, ...): Above (1) to (4) will be logged.
75 * * RUBY_DEBUG_LOG2(file, line, fmt, ...):
76 * Same as RUBY_DEBUG_LOG(), but (1) will be replaced with given file, line.
79 extern enum ruby_debug_log_mode
{
80 ruby_debug_log_disabled
= 0x00,
81 ruby_debug_log_memory
= 0x01,
82 ruby_debug_log_stderr
= 0x02,
83 ruby_debug_log_file
= 0x04,
84 } ruby_debug_log_mode
;
86 RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT
, 4, 5)
87 void ruby_debug_log(const char *file
, int line
, const char *func_name
, const char *fmt
, ...);
88 void ruby_debug_log_print(unsigned int n
);
89 bool ruby_debug_log_filter(const char *func_name
, const char *file_name
);
91 #if RBIMPL_COMPILER_IS(GCC) && defined(__OPTIMIZE__)
92 # define ruby_debug_log(...) \
93 RB_GNUC_EXTENSION_BLOCK( \
94 RBIMPL_WARNING_PUSH(); \
95 RBIMPL_WARNING_IGNORED(-Wformat-zero-length); \
96 ruby_debug_log(__VA_ARGS__); \
100 // convenient macro to log even if the USE_RUBY_DEBUG_LOG macro is not specified.
101 // You can use this macro for temporary usage (you should not commit it).
102 #define _RUBY_DEBUG_LOG(...) ruby_debug_log(__FILE__, __LINE__, RUBY_FUNCTION_NAME_STRING, "" __VA_ARGS__)
104 #if USE_RUBY_DEBUG_LOG
105 # define RUBY_DEBUG_LOG_ENABLED(func_name, file_name) \
106 (ruby_debug_log_mode && ruby_debug_log_filter(func_name, file_name))
108 #define RUBY_DEBUG_LOG(...) do { \
109 if (RUBY_DEBUG_LOG_ENABLED(RUBY_FUNCTION_NAME_STRING, __FILE__)) \
110 ruby_debug_log(__FILE__, __LINE__, RUBY_FUNCTION_NAME_STRING, "" __VA_ARGS__); \
113 #define RUBY_DEBUG_LOG2(file, line, ...) do { \
114 if (RUBY_DEBUG_LOG_ENABLED(RUBY_FUNCTION_NAME_STRING, file)) \
115 ruby_debug_log(file, line, RUBY_FUNCTION_NAME_STRING, "" __VA_ARGS__); \
118 #else // USE_RUBY_DEBUG_LOG
120 #define RUBY_DEBUG_LOG(...)
121 #define RUBY_DEBUG_LOG2(file, line, ...)
122 #endif // USE_RUBY_DEBUG_LOG
124 #endif /* RUBY_DEBUG_H */