ggml : Print backtrace on uncaught C++ exceptions (ggml/1232)
The goal is to have what users call "full logs" contain the backtrace. This is registered upon ggml_init. Also fixes a minor fd leak on Linux.
This commit is contained in:
parent
8726392d3d
commit
fedf034a98
4 changed files with 37 additions and 1 deletions
|
@ -133,7 +133,7 @@ static void ggml_print_backtrace_symbols(void) {
|
|||
}
|
||||
#endif
|
||||
|
||||
static void ggml_print_backtrace(void) {
|
||||
void ggml_print_backtrace(void) {
|
||||
const char * GGML_NO_BACKTRACE = getenv("GGML_NO_BACKTRACE");
|
||||
if (GGML_NO_BACKTRACE) {
|
||||
return;
|
||||
|
@ -160,6 +160,10 @@ static void ggml_print_backtrace(void) {
|
|||
const int parent_pid = getpid();
|
||||
const int child_pid = fork();
|
||||
if (child_pid < 0) { // error
|
||||
#if defined(__linux__)
|
||||
close(lock[1]);
|
||||
close(lock[0]);
|
||||
#endif
|
||||
return;
|
||||
} else if (child_pid == 0) { // child
|
||||
char attach[32];
|
||||
|
@ -167,6 +171,7 @@ static void ggml_print_backtrace(void) {
|
|||
#if defined(__linux__)
|
||||
close(lock[1]);
|
||||
(void) !read(lock[0], lock, 1);
|
||||
close(lock[0]);
|
||||
#endif
|
||||
// try gdb
|
||||
execlp("gdb", "gdb", "--batch",
|
||||
|
@ -216,6 +221,8 @@ void ggml_abort(const char * file, int line, const char * fmt, ...) {
|
|||
abort();
|
||||
}
|
||||
|
||||
// ggml_print_backtrace is registered with std::set_terminate by ggml.cpp
|
||||
|
||||
//
|
||||
// logging
|
||||
//
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue