better stracktrace on linux (using gdb if wanted)
This commit is contained in:
+3
-4
@@ -11,10 +11,9 @@
|
|||||||
#define proc auto
|
#define proc auto
|
||||||
#define concat(x, y) x ## y
|
#define concat(x, y) x ## y
|
||||||
#define label(x, y) concat(x, y)
|
#define label(x, y) concat(x, y)
|
||||||
#define line_label(x) label(x, __LINE__)
|
|
||||||
|
|
||||||
#define MPI_LABEL(id1,id2) \
|
#define MPI_LABEL(id1,id2) \
|
||||||
concat(MPI_LABEL_ ## id1 ## _ ## id2 ## _, __LINE__)
|
label(MPI_LABEL_ ## id1 ## _ ## id2 ## _, __LINE__)
|
||||||
|
|
||||||
#define MPP_DECLARE(labid, declaration) \
|
#define MPP_DECLARE(labid, declaration) \
|
||||||
if (0) \
|
if (0) \
|
||||||
@@ -51,10 +50,10 @@
|
|||||||
|
|
||||||
|
|
||||||
// #ifndef min
|
// #ifndef min
|
||||||
// #define min(a, b) ((a) < (b)) ? (a) : (b)
|
#define min(a, b) ((a) < (b)) ? (a) : (b)
|
||||||
// #endif
|
// #endif
|
||||||
// #ifndef max
|
// #ifndef max
|
||||||
// #define max(a, b) ((a) > (b)) ? (a) : (b)
|
#define max(a, b) ((a) > (b)) ? (a) : (b)
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+30
-4
@@ -1,14 +1,23 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "platform.hpp"
|
#include "platform.hpp"
|
||||||
|
#include "allocation_stats.hpp"
|
||||||
|
|
||||||
#if defined FTB_WINDOWS
|
#if defined FTB_WINDOWS
|
||||||
# include <dbghelp.h>
|
# include <dbghelp.h>
|
||||||
#else
|
#else
|
||||||
# include <execinfo.h>
|
# ifdef FTB_LINUX_STACK_TRACE_USE_GDB
|
||||||
# include <unistd.h>
|
# include <stdio.h>
|
||||||
# include "stdio.h"
|
# include <stdlib.h>
|
||||||
# include "stdlib.h"
|
# include <sys/wait.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
# include <sys/prctl.h>
|
||||||
|
# else
|
||||||
|
# include <execinfo.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
# include "stdio.h"
|
||||||
|
# include "stdlib.h"
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto print_stacktrace() -> void {
|
auto print_stacktrace() -> void {
|
||||||
@@ -33,6 +42,22 @@ auto print_stacktrace() -> void {
|
|||||||
printf( " %3i: %s\n", frames - i - 1, symbol->Name);
|
printf( " %3i: %s\n", frames - i - 1, symbol->Name);
|
||||||
}
|
}
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
#else
|
||||||
|
#ifdef FTB_LINUX_STACK_TRACE_USE_GDB
|
||||||
|
printf("Stacktrace: \n");
|
||||||
|
char pid_buf[30];
|
||||||
|
sprintf(pid_buf, "%d", getpid());
|
||||||
|
char name_buf[512];
|
||||||
|
name_buf[readlink("/proc/self/exe", name_buf, 511)]=0;
|
||||||
|
prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0);
|
||||||
|
int child_pid = fork();
|
||||||
|
if (!child_pid) {
|
||||||
|
dup2(2,1); // redirect output to stderr - edit: unnecessary?
|
||||||
|
execl("/usr/bin/gdb", "gdb", "--batch", "-n", "-ex", "thread", "-ex", "bt", name_buf, pid_buf, NULL);
|
||||||
|
abort(); /* If gdb failed to start */
|
||||||
|
} else {
|
||||||
|
waitpid(child_pid,NULL,0);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
// NOTE(Felix): Don't forget to compile with "-rdynamic"
|
// NOTE(Felix): Don't forget to compile with "-rdynamic"
|
||||||
printf("Stacktrace (this is unmagled -- sorry): \n");
|
printf("Stacktrace (this is unmagled -- sorry): \n");
|
||||||
@@ -47,4 +72,5 @@ auto print_stacktrace() -> void {
|
|||||||
puts("");
|
puts("");
|
||||||
ftb_free(strings);
|
ftb_free(strings);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user