[sheepdog] [PATCH 1/4] trace: fix negative index for ret stack array
Liu Yuan
namei.unix at gmail.com
Sat Sep 1 17:26:15 CEST 2012
From: Liu Yuan <tailai.ly at taobao.com>
In some unusual corner cases, pop_return_trace() will be called first, to
avoid negative index, we start at the middle of array. On the buffer reader
side, we can minus TRACE_RET_STACK_LEN / 2 to identify those negative index
which are actually uselss because we don't store their entry time.
Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
collie/debug.c | 8 +++++++-
include/sheep.h | 2 ++
sheep/trace/graph.c | 11 +++++++++--
3 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/collie/debug.c b/collie/debug.c
index 250a131..c40d164 100644
--- a/collie/debug.c
+++ b/collie/debug.c
@@ -53,6 +53,11 @@ static inline void print_finale(struct trace_graph_item *item)
static void print_trace_item(struct trace_graph_item *item)
{
+ item->depth -= TRACE_RET_STACK_LEN / 2;
+ /* Ignore the item that doesn't have entry time stored */
+ if (item->depth < 0)
+ return;
+
print_thread_name(item);
print_time(item);
print_finale(item);
@@ -180,7 +185,8 @@ static int trace_cat(int argc, char **argv)
return EXIT_SYSFAIL;
}
- map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+ map = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE, fd, 0);
close(fd);
if (map == MAP_FAILED) {
fprintf(stderr, "%m\n");
diff --git a/include/sheep.h b/include/sheep.h
index a2d0cd9..36de58b 100644
--- a/include/sheep.h
+++ b/include/sheep.h
@@ -47,6 +47,8 @@ struct vdi_copy {
#define TRACE_FNAME_LEN 36
#define TRACE_THREAD_LEN 20
+#define TRACE_RET_STACK_LEN 100
+
struct trace_graph_item {
char tname[TRACE_THREAD_LEN];
int type;
diff --git a/sheep/trace/graph.c b/sheep/trace/graph.c
index ab3a6c3..e39b801 100644
--- a/sheep/trace/graph.c
+++ b/sheep/trace/graph.c
@@ -19,12 +19,19 @@
#include "logger.h"
#include "util.h"
-static __thread int ret_stack_index;
+/*
+ * In some unusual corner cases, pop_return_trace() will be called first, to
+ * avoid negative index, we start at the middle of array. On the buffer reader
+ * side, we can minus TRACE_RET_STACK_LEN / 2 to identify those negative index
+ * which are actually uselss because we don't store their entry time.
+ */
+static __thread int ret_stack_index = TRACE_RET_STACK_LEN / 2;
+
static __thread struct trace_ret_stack {
unsigned long ret;
unsigned long func;
unsigned long long entry_time;
-} trace_ret_stack[100]; /* FIXME: consider stack overrun */
+} trace_ret_stack[TRACE_RET_STACK_LEN]; /* FIXME: consider stack overrun */
static void push_return_trace(unsigned long ret, unsigned long long etime,
unsigned long func, int *depth)
--
1.7.12.84.gefa6462
More information about the sheepdog
mailing list