The trace content needs to match the metadata, else the trace will be
corrupted.

Signed-off-by: Mathieu Desnoyers <[email protected]>
---
 lttng-context-callstack.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/lttng-context-callstack.c b/lttng-context-callstack.c
index 3b7859e..57738be 100644
--- a/lttng-context-callstack.c
+++ b/lttng-context-callstack.c
@@ -156,8 +156,12 @@ size_t lttng_callstack_get_size(size_t offset, struct 
lttng_ctx_field *field,
 
        /* do not write data if no space is available */
        trace = stack_trace_context(field, ctx);
-       if (!trace)
-               return 0;
+       if (unlikely(!trace)) {
+               size += lib_ring_buffer_align(offset, lttng_alignof(unsigned 
int));
+               size += sizeof(unsigned int);
+               size += lib_ring_buffer_align(offset, lttng_alignof(unsigned 
long));
+               return size;
+       }
 
        /* reset stack trace, no need to clear memory */
        trace->nr_entries = 0;
@@ -191,8 +195,13 @@ void lttng_callstack_record(struct lttng_ctx_field *field,
        struct stack_trace *trace = stack_trace_context(field, ctx);
        unsigned int nr_seq_entries;
 
-       if (!trace)
+       if (unlikely(!trace)) {
+               nr_seq_entries = 0;
+               lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned int));
+               chan->ops->event_write(ctx, &nr_seq_entries, sizeof(unsigned 
int));
+               lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned long));
                return;
+       }
        lib_ring_buffer_align_ctx(ctx, lttng_alignof(unsigned int));
        nr_seq_entries = trace->nr_entries;
        if (trace->nr_entries == trace->max_entries)
-- 
2.1.4

_______________________________________________
lttng-dev mailing list
[email protected]
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to