Loading...
--- libmalloc/libmalloc-715.120.13/src/stack_trace.c
+++ libmalloc/libmalloc-474.0.13/src/stack_trace.c
@@ -24,7 +24,7 @@
 #include "stack_trace.h"
 
 #include <TargetConditionals.h>
-#include <execinfo.h>
+#include <thread_stack_pcs.h>
 
 
 // Note: Shifts on signed types are a minefield.  Avoid doing it!
@@ -140,17 +140,20 @@
 size_t
 trace_collect(uint8_t *buffer, size_t size)
 {
-	// frame 0: this function (no inline)
-	const uint32_t dropped_frames = 1;
+	// frame 0: thread_stack_pcs() itself
+	// frame 1: this function (no inline)
+	// last frame: usually garbage value
+	const uint32_t dropped_frames = 3;
 	const uint32_t good_frames = 64;
 	const uint32_t max_frames = good_frames + dropped_frames;
 	vm_address_t frames[max_frames];
 
-	uint32_t num_frames = backtrace((void **)frames, max_frames);
+	uint32_t num_frames;
+	thread_stack_pcs(frames, max_frames, &num_frames);
 	if (num_frames <= dropped_frames) {
 		return 0;
 	}
 
 	uint32_t num_addrs = num_frames - dropped_frames;
-	return trace_encode(buffer, size, &frames[1], num_addrs);
+	return trace_encode(buffer, size, &frames[2], num_addrs);
 }