From: monojenkins Date: Tue, 17 Mar 2020 02:23:38 +0000 (-0400) Subject: [merp] Add breadcrumb for StackHash (#33635) X-Git-Tag: submit/tizen/20210909.063632~9130 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c3257c27779f6995af00b96e9d86d6aadbbb0e0c;p=platform%2Fupstream%2Fdotnet%2Fruntime.git [merp] Add breadcrumb for StackHash (#33635) Contributes to https://github.com/mono/mono/issues/18715 Co-authored-by: alexischr --- diff --git a/src/mono/mono/metadata/threads.c b/src/mono/mono/metadata/threads.c index f244d26..f28e0bd 100644 --- a/src/mono/mono/metadata/threads.c +++ b/src/mono/mono/metadata/threads.c @@ -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)); diff --git a/src/mono/mono/utils/mono-state.c b/src/mono/mono/utils/mono-state.c index a144eb1..717c88c 100644 --- a/src/mono/mono/utils/mono-state.c +++ b/src/mono/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/src/mono/mono/utils/mono-state.h b/src/mono/mono/utils/mono-state.h index 8b5e6b4..ae49fae 100644 --- a/src/mono/mono/utils/mono-state.h +++ b/src/mono/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)