[merp] Add breadcrumb for StackHash (#33635)
authormonojenkins <jo.shields+jenkins@xamarin.com>
Tue, 17 Mar 2020 02:23:38 +0000 (22:23 -0400)
committerGitHub <noreply@github.com>
Tue, 17 Mar 2020 02:23:38 +0000 (22:23 -0400)
Contributes to https://github.com/mono/mono/issues/18715

<!--
Thank you for your Pull Request!

If you are new to contributing to Mono, please try to do your best at conforming to our coding guidelines http://www.mono-project.com/community/contributing/coding-guidelines/ but don't worry if you get something wrong. One of the project members will help you to get things landed.

Does your pull request fix any of the existing issues? Please use the following format: Fixes #issue-number
-->

Co-authored-by: alexischr <alexischr@users.noreply.github.com>
src/mono/mono/metadata/threads.c
src/mono/mono/utils/mono-state.c
src/mono/mono/utils/mono-state.h

index f244d26..f28e0bd 100644 (file)
@@ -6523,6 +6523,9 @@ summarizer_state_term (SummarizerGlobalState *state, gchar **out, gchar *mem, si
                mono_get_eh_callbacks ()->mono_summarize_managed_stack (threads [i]);
        }
 
+       /* The value of the breadcrumb should match the "StackHash" value written by `mono_merp_write_fingerprint_payload` */
+       mono_create_crash_hash_breadcrumb (controlling);
+
        MonoStateWriter writer;
        memset (&writer, 0, sizeof (writer));
 
index a144eb1..717c88c 100644 (file)
@@ -156,6 +156,12 @@ file_for_dump_reason_breadcrumb (const char *directory, const char *dump_reason,
        g_snprintf (buff, sizeof_buff, "%s%scrash_reason_%s", directory, G_DIR_SEPARATOR_S, dump_reason);
 }
 
+static void
+file_for_hash_breadcrumb (const char *directory, MonoStackHash hashes, gchar *buff, size_t sizeof_buff)
+{
+       g_snprintf (buff, sizeof_buff, "%s%scrash_hash_0x%" PRIx64 "", directory, G_DIR_SEPARATOR_S, (uint64_t)hashes.offset_rich_hash);
+}
+
 static void create_breadcrumb (const char *path)
 {
        int handle = g_open (path, O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);
@@ -184,6 +190,14 @@ create_dump_reason_breadcrumb (const char *dump_reason)
        create_breadcrumb (out_file);
 }
 
+void
+mono_create_crash_hash_breadcrumb (MonoThreadSummary *thread)
+{
+       char out_file [200];
+       file_for_hash_breadcrumb (log.directory, thread->hashes, out_file, sizeof(out_file));
+       create_breadcrumb (out_file);
+}
+
 gboolean
 mono_summarize_set_timeline_dir (const char *directory)
 {
index 8b5e6b4..ae49fae 100644 (file)
@@ -123,6 +123,9 @@ mono_crash_save_failfast_msg (char *msg);
 const char*
 mono_crash_get_failfast_msg (void);
 
+void
+mono_create_crash_hash_breadcrumb (MonoThreadSummary *thread);
+
 #endif // DISABLE_CRASH_REPORTING
 
 // Dump context functions (enter/leave)