mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2025-12-31 20:36:25 +00:00
libsysprof-capture: handle unwind length < 0 gracefully
Also do the snapshot before setting up frame so that unwinders can do tricks to use extra space before the addr location.
This commit is contained in:
@ -1697,7 +1697,7 @@ sysprof_capture_writer_add_allocation (SysprofCaptureWriter *self,
|
||||
{
|
||||
SysprofCaptureAllocation *ev;
|
||||
size_t len;
|
||||
unsigned int n_addrs;
|
||||
int n_addrs;
|
||||
|
||||
assert (self != NULL);
|
||||
assert (backtrace_func != NULL);
|
||||
@ -1707,6 +1707,9 @@ sysprof_capture_writer_add_allocation (SysprofCaptureWriter *self,
|
||||
if (!ev)
|
||||
return false;
|
||||
|
||||
if ((n_addrs = backtrace_func (ev->addrs, MAX_UNWIND_DEPTH, backtrace_data)) < 0)
|
||||
n_addrs = 0;
|
||||
|
||||
sysprof_capture_writer_frame_init (&ev->frame,
|
||||
len,
|
||||
cpu,
|
||||
@ -1720,8 +1723,6 @@ sysprof_capture_writer_add_allocation (SysprofCaptureWriter *self,
|
||||
ev->tid = tid;
|
||||
ev->n_addrs = 0;
|
||||
|
||||
n_addrs = backtrace_func (ev->addrs, MAX_UNWIND_DEPTH, backtrace_data);
|
||||
|
||||
if (n_addrs <= MAX_UNWIND_DEPTH)
|
||||
ev->n_addrs = n_addrs;
|
||||
|
||||
|
||||
@ -525,6 +525,9 @@ sysprof_collector_allocate (SysprofCaptureAddress alloc_addr,
|
||||
else
|
||||
n_addrs = 0;
|
||||
|
||||
if (n_addrs < 0)
|
||||
n_addrs = 0;
|
||||
|
||||
ev->n_addrs = ((n_addrs < 0) ? 0 : (n_addrs > MAX_UNWIND_DEPTH) ? MAX_UNWIND_DEPTH : n_addrs);
|
||||
ev->frame.len = sizeof *ev + sizeof (SysprofCaptureAddress) * ev->n_addrs;
|
||||
ev->frame.type = SYSPROF_CAPTURE_FRAME_ALLOCATION;
|
||||
|
||||
Reference in New Issue
Block a user