From 8487188883f830600a22f76c0e593ba4c01ca53a Mon Sep 17 00:00:00 2001 From: monojenkins Date: Tue, 17 Mar 2020 11:59:07 -0400 Subject: [2019-12] [merp] Add breadcrumb for StackHash (#19243) * [merp] Add breadcrumb for StackHash Contributes to https://github.com/mono/mono/issues/18715 Co-authored-by: Alexis Christoforides --- mono/metadata/threads.c | 3 +++ mono/utils/mono-state.c | 14 ++++++++++++++ mono/utils/mono-state.h | 3 +++ 3 files changed, 20 insertions(+) diff --git a/mono/metadata/threads.c b/mono/metadata/threads.c index 712dad4b7b4..470e7fcdfb8 100644 --- a/mono/metadata/threads.c +++ b/mono/metadata/threads.c @@ -6513,6 +6513,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)); diff --git a/mono/utils/mono-state.c b/mono/utils/mono-state.c index 572f6976a4c..27cc909e8b6 100644 --- a/mono/utils/mono-state.c +++ b/mono/utils/mono-state.c @@ -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) { diff --git a/mono/utils/mono-state.h b/mono/utils/mono-state.h index 8b5e6b4dec0..ae49faee1df 100644 --- a/mono/utils/mono-state.h +++ b/mono/utils/mono-state.h @@ -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) -- cgit v1.2.3