[merp] Include any managed methods in the 'unmanaged_frames' portion … (mono/mono...
authorAlexis Christoforides <alexis@thenull.net>
Wed, 2 Oct 2019 05:11:35 +0000 (01:11 -0400)
committerGitHub <noreply@github.com>
Wed, 2 Oct 2019 05:11:35 +0000 (01:11 -0400)
* [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
src/mono/mono/utils/mono-state.c
src/mono/mono/utils/mono-state.h

index 40839d5..4a2c757 100644 (file)
@@ -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;
index a8cc50e..ac604dc 100644 (file)
@@ -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");
index cd3842a..b37fa5d 100644 (file)
@@ -18,7 +18,7 @@
 #include <mono/metadata/threads-types.h>
 #include <mono/utils/json.h>
 
-#define MONO_NATIVE_STATE_PROTOCOL_VERSION "0.0.4"
+#define MONO_NATIVE_STATE_PROTOCOL_VERSION "0.0.5"
 
 typedef enum {
        MonoSummaryNone,