#endif
}
-pid_t
-mono_runtime_syscall_fork ()
-{
-#ifdef HAVE_FORK
- return (pid_t) fork ();
-#else
- g_assert_not_reached ();
-#endif
-}
-
-void
-mono_gdb_render_native_backtraces (pid_t crashed_pid)
-{
-#ifdef HAVE_EXECV
- const char *argv [6];
- char template [] = "/tmp/mono-gdb-commands.XXXXXX";
- FILE *commands;
- gboolean using_lldb = FALSE;
-
- using_lldb = TRUE;
-
- argv [0] = g_find_program_in_path ("gdb");
- if (argv [0])
- using_lldb = FALSE;
-
- if (using_lldb)
- argv [0] = g_find_program_in_path ("lldb");
-
- if (argv [0] == NULL)
- return;
-
- if (mkstemp (template) == -1)
- return;
-
- commands = fopen (template, "w");
- if (using_lldb) {
- fprintf (commands, "process attach --pid %ld\n", (long) crashed_pid);
- fprintf (commands, "thread list\n");
- fprintf (commands, "thread backtrace all\n");
- fprintf (commands, "detach\n");
- fprintf (commands, "quit\n");
- argv [1] = "--source";
- argv [2] = template;
- argv [3] = 0;
-
- } else {
- fprintf (commands, "attach %ld\n", (long) crashed_pid);
- fprintf (commands, "info threads\n");
- fprintf (commands, " t a a info thread\n");
- fprintf (commands, "thread apply all bt\n");
- argv [1] = "-batch";
- argv [2] = "-x";
- argv [3] = template;
- argv [4] = "-nx";
- argv [5] = 0;
- }
- fflush (commands);
- fclose (commands);
-
- fclose (stdin);
-
- execv (argv [0], (char**)argv);
- unlink (template);
-#else
- fprintf (stderr, "mono_gdb_render_native_backtraces not supported on this platform\n");
-#endif // HAVE_EXECV
-}
-
gboolean
mono_thread_state_init_from_handle (MonoThreadUnwindState *tctx, MonoThreadInfo *info)
{
{
}
-#if !defined(PLATFORM_MACOSX)
-pid_t
-mono_runtime_syscall_fork (void)
-{
- g_assert_not_reached();
- return 0;
-}
-
-void
-mono_gdb_render_native_backtraces (pid_t crashed_pid)
-{
-}
-#endif
-
#else
static GHashTable *mono_saved_signal_handlers = NULL;
#endif
-#if !defined(PLATFORM_MACOSX)
+#endif /* defined(__native_client__) || defined(HOST_WATCHOS) */
+
+#if defined(__native_client__)
+
+pid_t
+mono_runtime_syscall_fork ()
+{
+ g_assert_not_reached ();
+}
+
+void
+mono_gdb_render_native_backtraces (pid_t crashed_pid)
+{
+}
+
+#else
+
pid_t
mono_runtime_syscall_fork ()
{
return 0;
#elif defined(SYS_fork)
return (pid_t) syscall (SYS_fork);
+#elif defined(PLATFORM_MACOSX) && HAVE_FORK
+ return (pid_t) fork ();
#else
g_assert_not_reached ();
return 0;
#endif
}
+static gboolean
+native_stack_with_gdb (pid_t crashed_pid, const char **argv, FILE *commands, char* commands_filename)
+{
+ gchar *gdb;
+
+ gdb = g_find_program_in_path ("gdb");
+ if (!gdb)
+ return FALSE;
+
+ argv [0] = gdb;
+ argv [1] = "-batch";
+ argv [2] = "-x";
+ argv [3] = commands_filename;
+ argv [4] = "-nx";
+
+ fprintf (commands, "attach %ld\n", (long) crashed_pid);
+ fprintf (commands, "info threads\n");
+ fprintf (commands, "thread apply all bt\n");
+
+ return TRUE;
+}
+
+
+static gboolean
+native_stack_with_lldb (pid_t crashed_pid, const char **argv, FILE *commands, char* commands_filename)
+{
+ gchar *lldb;
+
+ lldb = g_find_program_in_path ("lldb");
+ if (!lldb)
+ return FALSE;
+
+ argv [0] = lldb;
+ argv [1] = "--batch";
+ argv [2] = "--source";
+ argv [3] = commands_filename;
+ argv [4] = "--no-lldbinit";
+
+ fprintf (commands, "process attach --pid %ld\n", (long) crashed_pid);
+ fprintf (commands, "thread list\n");
+ fprintf (commands, "thread backtrace all\n");
+ fprintf (commands, "detach\n");
+ fprintf (commands, "quit\n");
+
+ return TRUE;
+}
+
void
mono_gdb_render_native_backtraces (pid_t crashed_pid)
{
+#ifdef HAVE_EXECV
const char *argv [10];
- char template_ [] = "/tmp/mono-lldb-commands.XXXXXX";
- char buf1 [128];
FILE *commands;
- gboolean using_lldb = FALSE;
+ char commands_filename [] = "/tmp/mono-gdb-commands.XXXXXX";
- argv [0] = g_find_program_in_path ("gdb");
- if (argv [0] == NULL) {
- argv [0] = g_find_program_in_path ("lldb");
- using_lldb = TRUE;
- }
+ if (mkstemp (commands_filename) == -1)
+ return;
- if (argv [0] == NULL)
+ commands = fopen (commands_filename, "w");
+ if (!commands) {
+ unlink (commands_filename);
return;
+ }
- if (using_lldb) {
- if (mkstemp (template_) == -1)
- return;
+ memset (argv, 0, sizeof (char*) * 10);
+
+#if defined(PLATFORM_MACOSX)
+ if (native_stack_with_lldb (crashed_pid, argv, commands, commands_filename))
+ goto exec;
+#endif
- commands = fopen (template_, "w");
+ if (native_stack_with_gdb (crashed_pid, argv, commands, commands_filename))
+ goto exec;
- fprintf (commands, "process attach --pid %ld\n", (long) crashed_pid);
- fprintf (commands, "thread list\n");
- fprintf (commands, "thread backtrace all\n");
- fprintf (commands, "detach\n");
- fprintf (commands, "quit\n");
+#if !defined(PLATFORM_MACOSX)
+ if (native_stack_with_lldb (crashed_pid, argv, commands, commands_filename))
+ goto exec;
+#endif
- fflush (commands);
- fclose (commands);
+ fprintf (stderr, "mono_gdb_render_native_backtraces not supported on this platform, unable to find gdb or lldb\n");
- argv [1] = "--source";
- argv [2] = template_;
- argv [3] = 0;
- } else {
- argv [1] = "-ex";
- sprintf (buf1, "attach %ld", (long) crashed_pid);
- argv [2] = buf1;
- argv [3] = "--ex";
- argv [4] = "info threads";
- argv [5] = "--ex";
- argv [6] = "thread apply all bt";
- argv [7] = "--batch";
- argv [8] = "-nx";
- argv [9] = 0;
- }
+ fclose (commands);
+ unlink (commands_filename);
+ return;
+exec:
execv (argv [0], (char**)argv);
- if (using_lldb)
- unlink (template_);
+ _exit (-1);
+#else
+ fprintf (stderr, "mono_gdb_render_native_backtraces not supported on this platform\n");
+#endif // HAVE_EXECV
}
-#endif
-#endif /* __native_client__ */
+
+#endif /* defined(__native_client__) */
#if !defined (__MACH__)