From 97b12f36752507f39ab1b40453852505ac8c1df7 Mon Sep 17 00:00:00 2001 From: Alexis Christoforides Date: Wed, 2 Oct 2019 01:11:35 -0400 Subject: [PATCH] =?utf8?q?[merp]=20Include=20any=20managed=20methods=20in?= =?utf8?q?=20the=20'unmanaged=5Fframes'=20portion=20=E2=80=A6=20(mono/mono?= =?utf8?q?#17090)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * [merp] Include any managed methods in the 'unmanaged_frames' portion of the output also This can help correlate the two lists when we have mixed managed & unmanaged stacks in our crash output. * Wehn symbol/function address is not found, still output the IaP * Don't set native_offset to ip, that's not what it means * [merp] Bump protocol version * Minor formatting fix * Remove paths from assembly image names * Remove unused var * Refactor filling in managed info for stack frame * Revert "Remove paths from assembly image names" This reverts commit mono/mono@defe86b471f37e12fa66a104747cac932943dca1. Commit migrated from https://github.com/mono/mono/commit/10e9159eaa92364f03c8359c47e6129aba1f9bda --- src/mono/mono/mini/mini-exceptions.c | 56 +++++++++++++++++++++++++----------- src/mono/mono/utils/mono-state.c | 1 + src/mono/mono/utils/mono-state.h | 2 +- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/mono/mono/mini/mini-exceptions.c b/src/mono/mono/mini/mini-exceptions.c index 40839d5..4a2c757 100644 --- a/src/mono/mono/mini/mini-exceptions.c +++ b/src/mono/mono/mini/mini-exceptions.c @@ -1435,6 +1435,22 @@ copy_summary_string_safe (char *in, const char *out) return; } +static void +fill_frame_managed_info (MonoFrameSummary *frame, MonoMethod * method) +{ + MonoImage *image = mono_class_get_image (method->klass); + // Used for hashing, more stable across rebuilds than using GUID + copy_summary_string_safe (frame->str_descr, image->assembly_name); + + frame->managed_data.guid = image->guid; + frame->managed_data.token = method->token; + frame->managed_data.filename = image->module_name; + + MonoDotNetHeader *header = &image->image_info->cli_header; + frame->managed_data.image_size = header->nt.pe_image_size; + frame->managed_data.time_date_stamp = image->time_date_stamp; +} + typedef struct { char *suffix; char *exported_name; @@ -1607,24 +1623,9 @@ summarize_frame_internal (MonoMethod *method, gpointer ip, size_t native_offset, ud->error = "Managed method frame, but no provided managed method"; return TRUE; } - - MonoImage *image = mono_class_get_image (method->klass); - // Used for hashing, more stable across rebuilds than using GUID - copy_summary_string_safe (dest->str_descr, image->assembly_name); - - dest->managed_data.guid = image->guid; - + fill_frame_managed_info (dest, method); dest->managed_data.native_offset = native_offset; - dest->managed_data.token = method->token; dest->managed_data.il_offset = il_offset; - - dest->managed_data.filename = image->module_name; - - MonoDotNetHeader *header = &image->image_info->cli_header; - dest->managed_data.image_size = header->nt.pe_image_size; - - dest->managed_data.time_date_stamp = image->time_date_stamp; - } else { dest->managed_data.token = -1; } @@ -1764,8 +1765,29 @@ mono_summarize_unmanaged_stack (MonoThreadSummary *out) MonoFrameSummary *frame = &out->unmanaged_frames [i]; const char* module_buf = frame->unmanaged_data.module; int success = mono_get_portable_ip (ip, &frame->unmanaged_data.ip, &frame->unmanaged_data.offset, &module_buf, (char *) frame->str_descr); - if (!success) + + /* attempt to look up any managed method at that ip */ + /* TODO: Trampolines - follow examples from mono_print_method_from_ip() */ + + MonoJitInfo *ji; + MonoDomain *domain = mono_domain_get (); + MonoDomain *target_domain; + ji = mini_jit_info_table_find_ext (domain, (char *)ip, TRUE, &target_domain); + if (ji) { + frame->is_managed = TRUE; + if (!ji->async && !ji->is_trampoline) { + MonoMethod *method = jinfo_get_method (ji); + fill_frame_managed_info (frame, method); +#ifndef MONO_PRIVATE_CRASHES + frame->managed_data.name = method->name; +#endif + } + } + + if (!success && !ji) { + frame->unmanaged_data.ip = ip; continue; + } if (out->unmanaged_frames [i].str_descr [0] != '\0') out->unmanaged_frames [i].unmanaged_data.has_name = TRUE; diff --git a/src/mono/mono/utils/mono-state.c b/src/mono/mono/utils/mono-state.c index a8cc50e..ac604dc 100644 --- a/src/mono/mono/utils/mono-state.c +++ b/src/mono/mono/utils/mono-state.c @@ -514,6 +514,7 @@ mono_native_state_add_frame (MonoStateWriter *writer, MonoFrameSummary *frame) mono_state_writer_printf(writer, "\"0x%05x\"\n", frame->managed_data.il_offset); } else { + mono_state_writer_printf(writer, "\n"); assert_has_space (writer); mono_state_writer_indent (writer); mono_state_writer_object_key (writer, "native_address"); diff --git a/src/mono/mono/utils/mono-state.h b/src/mono/mono/utils/mono-state.h index cd3842a..b37fa5d 100644 --- a/src/mono/mono/utils/mono-state.h +++ b/src/mono/mono/utils/mono-state.h @@ -18,7 +18,7 @@ #include #include -#define MONO_NATIVE_STATE_PROTOCOL_VERSION "0.0.4" +#define MONO_NATIVE_STATE_PROTOCOL_VERSION "0.0.5" typedef enum { MonoSummaryNone, -- 2.7.4