[common] debug: add color support to debug messages

People often miss the warnings about invalid arguments in their command
line, this last minute patch attempts to address this by making
warnings, errors, fixme's and fatal errors stand out if stdout is a TTY.
This commit is contained in:
Geoffrey McRae 2021-07-07 23:05:46 +10:00
parent ada6ada576
commit 1effd5fddc
8 changed files with 126 additions and 9 deletions

View File

@ -1052,6 +1052,9 @@ static void lg_shutdown(void)
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
// initialize for DEBUG_* macros
debug_init();
if (getuid() == 0) if (getuid() == 0)
{ {
DEBUG_ERROR("Do not run looking glass as root!"); DEBUG_ERROR("Do not run looking glass as root!");

View File

@ -30,6 +30,20 @@
#include <inttypes.h> #include <inttypes.h>
#include "time.h" #include "time.h"
enum DebugLevel
{
DEBUG_LEVEL_INFO,
DEBUG_LEVEL_WARN,
DEBUG_LEVEL_ERROR,
DEBUG_LEVEL_FIXME,
DEBUG_LEVEL_FATAL
};
extern const char ** debug_lookup;
void debug_init(void);
void debug_print(const enum DebugLevel level, const char * fmt, ...);
#ifdef ENABLE_BACKTRACE #ifdef ENABLE_BACKTRACE
void printBacktrace(void); void printBacktrace(void);
#define DEBUG_PRINT_BACKTRACE() printBacktrace() #define DEBUG_PRINT_BACKTRACE() printBacktrace()
@ -65,19 +79,20 @@ void printBacktrace(void);
sizeof(s) > 20 && (s)[sizeof(s)-21] == DIRECTORY_SEPARATOR ? (s) + sizeof(s) - 20 : \ sizeof(s) > 20 && (s)[sizeof(s)-21] == DIRECTORY_SEPARATOR ? (s) + sizeof(s) - 20 : \
sizeof(s) > 21 && (s)[sizeof(s)-22] == DIRECTORY_SEPARATOR ? (s) + sizeof(s) - 21 : (s)) sizeof(s) > 21 && (s)[sizeof(s)-22] == DIRECTORY_SEPARATOR ? (s) + sizeof(s) - 21 : (s))
#define DEBUG_PRINT(type, fmt, ...) do { \ #define DEBUG_PRINT(level, fmt, ...) do { \
fprintf(stderr, "%12" PRId64 " " type " %20s:%-4u | %-30s | " fmt "\n", \ fprintf(stdout, "%s%12" PRId64 "%20s:%-4u | %-30s | " fmt "\n", \
microtime(), STRIPPATH(__FILE__), __LINE__, __FUNCTION__, ##__VA_ARGS__);\ debug_lookup[level], microtime(), STRIPPATH(__FILE__), \
__LINE__, __FUNCTION__, ##__VA_ARGS__); \
} while (0) } while (0)
#define DEBUG_BREAK() DEBUG_PRINT("[ ]", "================================================================================") #define DEBUG_BREAK() DEBUG_PRINT(DEBUG_LEVEL_INFO, "================================================================================")
#define DEBUG_INFO(fmt, ...) DEBUG_PRINT("[I]", fmt, ##__VA_ARGS__) #define DEBUG_INFO(fmt, ...) DEBUG_PRINT(DEBUG_LEVEL_INFO, fmt, ##__VA_ARGS__)
#define DEBUG_WARN(fmt, ...) DEBUG_PRINT("[W]", fmt, ##__VA_ARGS__) #define DEBUG_WARN(fmt, ...) DEBUG_PRINT(DEBUG_LEVEL_WARN, fmt, ##__VA_ARGS__)
#define DEBUG_ERROR(fmt, ...) DEBUG_PRINT("[E]", fmt, ##__VA_ARGS__) #define DEBUG_ERROR(fmt, ...) DEBUG_PRINT(DEBUG_LEVEL_ERROR, fmt, ##__VA_ARGS__)
#define DEBUG_FIXME(fmt, ...) DEBUG_PRINT("[F]", fmt, ##__VA_ARGS__) #define DEBUG_FIXME(fmt, ...) DEBUG_PRINT(DEBUG_LEVEL_FIXME, fmt, ##__VA_ARGS__)
#define DEBUG_FATAL(fmt, ...) do { \ #define DEBUG_FATAL(fmt, ...) do { \
DEBUG_BREAK(); \ DEBUG_BREAK(); \
DEBUG_PRINT("[!]", fmt, ##__VA_ARGS__); \ DEBUG_PRINT(DEBUG_LEVEL_FATAL, fmt, ##__VA_ARGS__); \
DEBUG_PRINT_BACKTRACE(); \ DEBUG_PRINT_BACKTRACE(); \
abort(); \ abort(); \
} while(0) } while(0)

View File

@ -7,6 +7,7 @@ include_directories(
) )
add_library(lg_common_platform_code STATIC add_library(lg_common_platform_code STATIC
debug.c
crash.c crash.c
sysinfo.c sysinfo.c
thread.c thread.c

View File

@ -0,0 +1,54 @@
/**
* Looking Glass
* Copyright (C) 2017-2021 The Looking Glass Authors
* https://looking-glass.io
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc., 59
* Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "common/debug.h"
#include <unistd.h>
#define COLOR_RESET "\033[0m"
#define COLOR_YELLOW "\033[0;33m"
#define COLOR_RED "\033[0;31m"
#define COLOR_CYAN "\033[0;36m"
#define COLOR_WHITE "\033[0;37m"
const char ** debug_lookup = NULL;
void debug_init(void)
{
static const char * colorLookup[] =
{
COLOR_RESET "[I] ", // DEBUG_LEVEL_INFO
COLOR_YELLOW "[W] ", // DEBUG_LEVEL_WARN
COLOR_RED "[E] ", // DEBUG_LEVEL_ERROR
COLOR_CYAN "[F] ", // DEBUG_LEVEL_FIXME
COLOR_WHITE "[!] " // DEBUG_LEVEL_FATAL
};
static const char * plainLookup[] =
{
"[I] ", // DEBUG_LEVEL_INFO
"[W] ", // DEBUG_LEVEL_WARN
"[E] ", // DEBUG_LEVEL_ERROR
"[F] ", // DEBUG_LEVEL_FIXME
"[!] " // DEBUG_LEVEL_FATAL
};
debug_lookup = (isatty(0) == 1) ? colorLookup : plainLookup;
}

View File

@ -6,6 +6,7 @@ include_directories(
) )
add_library(lg_common_platform_code STATIC add_library(lg_common_platform_code STATIC
debug.c
crash.c crash.c
dpi.c dpi.c
sysinfo.c sysinfo.c

View File

@ -0,0 +1,37 @@
/**
* Looking Glass
* Copyright (C) 2017-2021 The Looking Glass Authors
* https://looking-glass.io
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc., 59
* Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "common/debug.h"
const char ** debug_lookup = NULL;
void debug_init(void)
{
static const char * plainLookup[] =
{
"[I] ", // DEBUG_LEVEL_INFO
"[W] ", // DEBUG_LEVEL_WARN
"[E] ", // DEBUG_LEVEL_ERROR
"[F] ", // DEBUG_LEVEL_FIXME
"[!] " // DEBUG_LEVEL_FATAL
};
debug_lookup = plainLookup;
}

View File

@ -41,6 +41,9 @@ struct app app = { 0 };
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
// initialize for DEBUG_* macros
debug_init();
app.executable = argv[0]; app.executable = argv[0];
struct passwd * pw = getpwuid(getuid()); struct passwd * pw = getpwuid(getuid());

View File

@ -314,6 +314,9 @@ fail:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ {
// initialize for DEBUG_* macros
debug_init();
// convert the command line to the standard argc and argv // convert the command line to the standard argc and argv
LPWSTR * wargv = CommandLineToArgvW(GetCommandLineW(), &app.argc); LPWSTR * wargv = CommandLineToArgvW(GetCommandLineW(), &app.argc);
app.argv = malloc(sizeof(char *) * app.argc); app.argv = malloc(sizeof(char *) * app.argc);