[coop handles] Record backtrace when allocating handles when MONO_HANDLE_TRACK_OWNER...
authorAleksey Kliger <aleksey@xamarin.com>
Fri, 8 Sep 2017 18:24:05 +0000 (14:24 -0400)
committerAleksey Kliger (λgeek) <akliger@gmail.com>
Tue, 12 Sep 2017 17:11:20 +0000 (13:11 -0400)
A backtrace that leads to the allocation site is helpful for debugging.

mono/metadata/handle.c
mono/metadata/handle.h

index 5e32a478a382160b163cbd68fea7ad41f9f442e3..4acf273f01c4bbdefc7ffee542bbc51ee11e5b2d 100644 (file)
 #include <mono/utils/atomic.h>
 #include <mono/utils/mono-lazy-init.h>
 #include <mono/utils/mono-threads.h>
+#ifdef HAVE_BACKTRACE_SYMBOLS
+#include <execinfo.h>
+#endif
+
 /* TODO (missing pieces)
 
 Add counters for:
@@ -167,7 +171,14 @@ chunk_element_to_chunk_idx (HandleStack *stack, HandleChunkElem *elem, int *out_
 }
 
 #ifdef MONO_HANDLE_TRACK_OWNER
-#define SET_OWNER(chunk,idx) do { (chunk)->elems[(idx)].owner = owner; } while (0)
+#ifdef HAVE_BACKTRACE_SYMBOLS
+#define SET_BACKTRACE(btaddrs) do {                                    \
+       backtrace(btaddrs, 7);                                          \
+       } while (0)
+#else
+#define SET_BACKTRACE(btaddrs) 0
+#endif
+#define SET_OWNER(chunk,idx) do { (chunk)->elems[(idx)].owner = owner; SET_BACKTRACE (&((chunk)->elems[(idx)].backtrace_ips[0])); } while (0)
 #else
 #define SET_OWNER(chunk,idx) do { } while (0)
 #endif
index 5de55eebc824540879dedab9bb5e555c99fc3276..40784ea78f17d41d7c1f49a4a168e83fdfd7be92 100644 (file)
@@ -66,6 +66,7 @@ typedef struct {
        gpointer o; /* MonoObject ptr or interior ptr */
 #ifdef MONO_HANDLE_TRACK_OWNER
        const char *owner;
+       gpointer backtrace_ips[7]; /* result of backtrace () at time of allocation */
 #endif
 #ifdef MONO_HANDLE_TRACK_SP
        gpointer alloc_sp; /* sp from HandleStack:stackmark_sp at time of allocation */