From b4f58ea3008e3e86bdc931407c68c6e0497ef078 Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Sun, 2 Aug 2020 04:24:47 +0900 Subject: support multiple filters by RUBY_DEBUG_LOG_FILTER Now you can specify multiple filters for RUBY_DEBUG_LOG output by RUBY_DEBUG_LOG_FILTER=a,b,c (in this case, logs that the function name contains a, b or c). --- debug.c | 61 +++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 16 deletions(-) (limited to 'debug.c') diff --git a/debug.c b/debug.c index 7241d37b4d..1dd7eebbb6 100644 --- a/debug.c +++ b/debug.c @@ -266,14 +266,14 @@ ruby_set_debug_option(const char *str) #define MAX_DEBUG_LOG 0x1000 #define MAX_DEBUG_LOG_MESSAGE_LEN 0x0200 -#define MAX_DEBUG_LOG_FILTER 0x0001 +#define MAX_DEBUG_LOG_FILTER 0x0010 enum ruby_debug_log_mode ruby_debug_log_mode; static struct { char *mem; unsigned int cnt; - const char *filters[MAX_DEBUG_LOG_FILTER]; + char filters[MAX_DEBUG_LOG_FILTER][MAX_DEBUG_LOG_FILTER]; unsigned int filters_num; rb_nativethread_lock_t lock; FILE *output; @@ -292,6 +292,7 @@ setup_debug_log(void) const char *log_config = getenv("RUBY_DEBUG_LOG"); if (log_config) { fprintf(stderr, "RUBY_DEBUG_LOG=%s\n", log_config); + unsetenv("RUBY_DEBUG_LOG"); if (strcmp(log_config, "mem") == 0) { debug_log.mem = (char *)malloc(MAX_DEBUG_LOG * MAX_DEBUG_LOG_MESSAGE_LEN); if (debug_log.mem == NULL) { @@ -317,12 +318,49 @@ setup_debug_log(void) // check RUBY_DEBUG_LOG_FILTER const char *filter_config = getenv("RUBY_DEBUG_LOG_FILTER"); - if (filter_config) { - fprintf(stderr, "RUBY_DEBUG_LOG_FILTER=%s\n", filter_config); + if (filter_config && strlen(filter_config) > 0) { + unsigned int i; + for (i=0; i= MAX_DEBUG_LOG_FILTER) { + fprintf(stderr, "too long: %s (max:%d)\n", filter_config, MAX_DEBUG_LOG_FILTER); + exit(1); + } + strncpy(debug_log.filters[i], filter_config, MAX_DEBUG_LOG_FILTER - 1); + i++; + break; + } + else { + size_t n = p - filter_config; + if (n >= MAX_DEBUG_LOG_FILTER) { + fprintf(stderr, "too long: %s (max:%d)\n", filter_config, MAX_DEBUG_LOG_FILTER); + exit(1); + } + strncpy(debug_log.filters[i], filter_config, n); + filter_config = p+1; + } + } + debug_log.filters_num = i; + for (i=0; i 0) { + for (unsigned int i = 0; i 0) { - int hit = 0; - for (unsigned int i = 0; i