mirror of
https://github.com/neovim/neovim.git
synced 2024-12-26 14:11:15 -07:00
log: Add log_callstack_to_file()
This makes it trivial to log the callstack to, e.g., stderr, which can simplify debug cycles.
This commit is contained in:
parent
e13b4a21ca
commit
17eb20b22e
@ -11,8 +11,9 @@ Logs
|
|||||||
|
|
||||||
Low-level log messages sink to `$NVIM_LOG_FILE`.
|
Low-level log messages sink to `$NVIM_LOG_FILE`.
|
||||||
|
|
||||||
You can use `LOG_CALLSTACK()` anywhere in the source to log the current
|
You can use `LOG_CALLSTACK();` anywhere in the source to log the current
|
||||||
stacktrace. (Currently Linux-only.)
|
stacktrace. To log in an alternate file, e.g. stderr, use
|
||||||
|
`LOG_CALLSTACK_TO_FILE(FILE*)`. (Currently Linux-only.)
|
||||||
|
|
||||||
UI events are logged at level 0 (`DEBUG_LOG_LEVEL`).
|
UI events are logged at level 0 (`DEBUG_LOG_LEVEL`).
|
||||||
|
|
||||||
|
@ -178,7 +178,8 @@ FILE *open_log_file(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_EXECINFO_BACKTRACE
|
#ifdef HAVE_EXECINFO_BACKTRACE
|
||||||
void log_callstack(const char *const func_name, const int line_num)
|
void log_callstack_to_file(FILE *log_file, const char *const func_name,
|
||||||
|
const int line_num)
|
||||||
{
|
{
|
||||||
void *trace[100];
|
void *trace[100];
|
||||||
int trace_size = backtrace(trace, ARRAY_SIZE(trace));
|
int trace_size = backtrace(trace, ARRAY_SIZE(trace));
|
||||||
@ -190,8 +191,6 @@ void log_callstack(const char *const func_name, const int line_num)
|
|||||||
}
|
}
|
||||||
assert(24 + exepathlen < IOSIZE); // Must fit in `cmdbuf` below.
|
assert(24 + exepathlen < IOSIZE); // Must fit in `cmdbuf` below.
|
||||||
|
|
||||||
do_log(DEBUG_LOG_LEVEL, func_name, line_num, true, "trace:");
|
|
||||||
|
|
||||||
char cmdbuf[IOSIZE + (20 * ARRAY_SIZE(trace))];
|
char cmdbuf[IOSIZE + (20 * ARRAY_SIZE(trace))];
|
||||||
snprintf(cmdbuf, sizeof(cmdbuf), "addr2line -e %s -f -p", exepath);
|
snprintf(cmdbuf, sizeof(cmdbuf), "addr2line -e %s -f -p", exepath);
|
||||||
for (int i = 1; i < trace_size; i++) {
|
for (int i = 1; i < trace_size; i++) {
|
||||||
@ -202,12 +201,8 @@ void log_callstack(const char *const func_name, const int line_num)
|
|||||||
// Now we have a command string like:
|
// Now we have a command string like:
|
||||||
// addr2line -e /path/to/exe -f -p 0x123 0x456 ...
|
// addr2line -e /path/to/exe -f -p 0x123 0x456 ...
|
||||||
|
|
||||||
log_lock();
|
do_log_to_file(log_file, DEBUG_LOG_LEVEL, func_name, line_num, true,
|
||||||
FILE *log_file = open_log_file();
|
"trace:");
|
||||||
if (log_file == NULL) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
FILE *fp = popen(cmdbuf, "r");
|
FILE *fp = popen(cmdbuf, "r");
|
||||||
char linebuf[IOSIZE];
|
char linebuf[IOSIZE];
|
||||||
while (fgets(linebuf, sizeof(linebuf) - 1, fp) != NULL) {
|
while (fgets(linebuf, sizeof(linebuf) - 1, fp) != NULL) {
|
||||||
@ -218,6 +213,18 @@ void log_callstack(const char *const func_name, const int line_num)
|
|||||||
if (log_file != stderr && log_file != stdout) {
|
if (log_file != stderr && log_file != stdout) {
|
||||||
fclose(log_file);
|
fclose(log_file);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_callstack(const char *const func_name, const int line_num)
|
||||||
|
{
|
||||||
|
log_lock();
|
||||||
|
FILE *log_file = open_log_file();
|
||||||
|
if (log_file == NULL) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_callstack_to_file(log_file, func_name, line_num);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
log_unlock();
|
log_unlock();
|
||||||
}
|
}
|
||||||
|
@ -63,6 +63,7 @@
|
|||||||
|
|
||||||
#ifdef HAVE_EXECINFO_BACKTRACE
|
#ifdef HAVE_EXECINFO_BACKTRACE
|
||||||
# define LOG_CALLSTACK() log_callstack(__func__, __LINE__)
|
# define LOG_CALLSTACK() log_callstack(__func__, __LINE__)
|
||||||
|
# define LOG_CALLSTACK_TO_FILE(fp) log_callstack_to_file(fp, __func__, __LINE__)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||||
|
Loading…
Reference in New Issue
Block a user