From 0bc0998d4226ba46cd564e919b51bbb4e4d784d7 Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Tue, 20 Feb 2007 00:38:53 +0000 Subject: 2007-02-20 Samuel Thibault Fix ddb's trace command. * i386/i386/db_trace.c (db_find_trace_symbols): Drop _ prefix on ELF targets. (db_i386_stack_trace): Check that adresses of known functions were really found. --- i386/i386/db_trace.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) (limited to 'i386') diff --git a/i386/i386/db_trace.c b/i386/i386/db_trace.c index d1c9512..aad305c 100644 --- a/i386/i386/db_trace.c +++ b/i386/i386/db_trace.c @@ -183,16 +183,22 @@ void db_find_trace_symbols(void) { db_expr_t value; - if (db_value_of_name("_user_trap", &value)) +#ifdef __ELF__ +#define P +#else +#define P "_" +#endif + if (db_value_of_name(P"user_trap", &value)) db_user_trap_symbol_value = (db_addr_t) value; - if (db_value_of_name("_kernel_trap", &value)) + if (db_value_of_name(P"kernel_trap", &value)) db_kernel_trap_symbol_value = (db_addr_t) value; - if (db_value_of_name("_interrupt", &value)) + if (db_value_of_name(P"interrupt", &value)) db_interrupt_symbol_value = (db_addr_t) value; - if (db_value_of_name("_return_to_iret", &value)) + if (db_value_of_name(P"return_to_iret", &value)) db_return_to_iret_symbol_value = (db_addr_t) value; - if (db_value_of_name("_syscall", &value)) + if (db_value_of_name(P"syscall", &value)) db_syscall_symbol_value = (db_addr_t) value; +#undef P db_trace_symbols_found = TRUE; } @@ -450,14 +456,14 @@ db_i386_stack_trace( DB_STGY_XTRN, (db_addr_t *)&offset, TASK_NULL), &name, (db_expr_t *)&call_func); - if (call_func == db_user_trap_symbol_value || - call_func == db_kernel_trap_symbol_value) { + if ((db_user_trap_symbol_value && call_func == db_user_trap_symbol_value) || + (db_kernel_trap_symbol_value && call_func == db_kernel_trap_symbol_value)) { frame_type = TRAP; narg = 1; - } else if (call_func == db_interrupt_symbol_value) { + } else if (db_interrupt_symbol_value && call_func == db_interrupt_symbol_value) { frame_type = INTERRUPT; goto next_frame; - } else if (call_func == db_syscall_symbol_value) { + } else if (db_syscall_symbol_value && call_func == db_syscall_symbol_value) { frame_type = SYSCALL; goto next_frame; } else { -- cgit v1.2.3