#if !defined(HOST_WIN32) && defined(HAVE_SYS_SYSCALL_H) && defined(SYS_fork)
if (!mini_get_debug_options ()->no_gdb_backtrace && !mono_debug_using_mono_debugger ()) {
/* From g_spawn_command_line_sync () in eglib */
- int res;
- int stdout_pipe [2] = { -1, -1 };
pid_t pid;
int status;
- char buffer [1024];
pid_t crashed_pid = getpid ();
- res = pipe (stdout_pipe);
- g_assert (res != -1);
-
//pid = fork ();
/*
* glibc fork acquires some locks, so if the crash happened inside malloc/free,
pid = mono_runtime_syscall_fork ();
if (pid == 0) {
- close (stdout_pipe [0]);
- dup2 (stdout_pipe [1], STDOUT_FILENO);
-
- for (i = getdtablesize () - 1; i >= 3; i--)
- close (i);
-
- if (!mono_gdb_render_native_backtraces (crashed_pid))
- close (STDOUT_FILENO);
+ dup2 (STDERR_FILENO, STDOUT_FILENO);
+ mono_gdb_render_native_backtraces (crashed_pid);
exit (1);
}
- close (stdout_pipe [1]);
-
fprintf (stderr, "\nDebug info from gdb:\n\n");
-
- while (1) {
- int nread = read (stdout_pipe [0], buffer, 1024);
-
- if (nread <= 0)
- break;
- write (STDERR_FILENO, buffer, nread);
- }
-
- waitpid (pid, &status, WNOHANG);
+ waitpid (pid, &status, 0);
}
#endif
/*
#endif
}
-gboolean
+void
mono_gdb_render_native_backtraces (pid_t crashed_pid)
{
const char *argv [9];
argv [0] = g_find_program_in_path ("gdb");
if (argv [0] == NULL) {
- return FALSE;
+ return;
}
argv [1] = "-ex";
argv [8] = 0;
execv (argv [0], (char**)argv);
-
- return TRUE;
}
#endif
#endif /* __native_client__ */
void mono_runtime_shutdown_stat_profiler (void) MONO_INTERNAL;
void mono_runtime_posix_install_handlers (void) MONO_INTERNAL;
pid_t mono_runtime_syscall_fork (void) MONO_INTERNAL;
-gboolean mono_gdb_render_native_backtraces (pid_t crashed_pid) MONO_INTERNAL;
+void mono_gdb_render_native_backtraces (pid_t crashed_pid) MONO_INTERNAL;
/*
* Signal handling