Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreutarass2011-08-29 17:25:01 +0000
committereutarass2011-08-29 17:25:01 +0000
commit73b987ff123090d182d7cbf43438fccfca731050 (patch)
tree8164f79f9204acf953ae9548bcc7d86b393dad5b
parent412252cefce30a26901c58b3151fb52e848cadfd (diff)
downloadorg.eclipse.tcf.agent-73b987ff123090d182d7cbf43438fccfca731050.tar.gz
org.eclipse.tcf.agent-73b987ff123090d182d7cbf43438fccfca731050.tar.xz
org.eclipse.tcf.agent-73b987ff123090d182d7cbf43438fccfca731050.zip
TCF Agent: improved stack tracing speed.
-rw-r--r--framework/cpudefs.c4
-rw-r--r--framework/cpudefs.h1
-rw-r--r--services/stacktrace.c11
3 files changed, 5 insertions, 11 deletions
diff --git a/framework/cpudefs.c b/framework/cpudefs.c
index 97231826..fbdfa28a 100644
--- a/framework/cpudefs.c
+++ b/framework/cpudefs.c
@@ -78,7 +78,9 @@ int write_reg_value(StackFrame * frame, RegisterDefinition * reg_def, uint64_t v
buf[reg_def->big_endian ? reg_def->size - i - 1 : i] = (uint8_t)value;
value = value >> 8;
}
- return write_reg_bytes(frame, reg_def, 0, reg_def->size, buf);
+ if (write_reg_bytes(frame, reg_def, 0, reg_def->size, buf) < 0) return -1;
+ if (!frame->is_top_frame) frame->has_reg_data = 1;
+ return 0;
}
ContextAddress get_regs_PC(Context * ctx) {
diff --git a/framework/cpudefs.h b/framework/cpudefs.h
index 6c73f08b..17a9a89f 100644
--- a/framework/cpudefs.h
+++ b/framework/cpudefs.h
@@ -113,6 +113,7 @@ typedef struct StackTracingInfo {
typedef struct StackFrame {
int is_top_frame;
+ int has_reg_data;
Context * ctx;
ContextAddress fp; /* frame address */
RegisterData * regs; /* register values */
diff --git a/services/stacktrace.c b/services/stacktrace.c
index 2b78b9ad..927621fa 100644
--- a/services/stacktrace.c
+++ b/services/stacktrace.c
@@ -74,15 +74,6 @@ static void invalidate_stack_trace(StackTrace * stack) {
stack->valid = 0;
}
-static int has_registers(StackFrame * frame) {
- uint64_t v;
- RegisterDefinition * r;
- for (r = get_reg_definitions(frame->ctx); r->name != NULL; r++) {
- if (read_reg_value(frame, r, &v) == 0) return 1;
- }
- return 0;
-}
-
static void trace_stack(Context * ctx, StackTrace * stack) {
int i;
int error = 0;
@@ -140,7 +131,7 @@ static void trace_stack(Context * ctx, StackTrace * stack) {
frame = down;
}
- if (!frame.is_top_frame && has_registers(&frame)) add_frame(stack, &frame);
+ if (frame.has_reg_data) add_frame(stack, &frame);
else loc_free(frame.regs);
if (get_error_code(error) == ERR_CACHE_MISS) {

Back to the top