mirror of
https://github.com/sstefani/mtrace.git
synced 2025-12-06 08:46:41 +08:00
performace improvments
This commit is contained in:
parent
c711f9e033
commit
037149204d
@ -34,15 +34,20 @@
|
||||
#define HW_BP_SCRATCH 2
|
||||
|
||||
struct breakpoint {
|
||||
int (*on_hit)(struct task *task, struct breakpoint *bp);
|
||||
struct library_symbol *libsym;
|
||||
arch_addr_t addr;
|
||||
|
||||
unsigned int enabled:1;
|
||||
unsigned int locked:1;
|
||||
unsigned int deleted:1;
|
||||
unsigned int type:2;
|
||||
unsigned int ext:8;
|
||||
|
||||
unsigned int refcnt;
|
||||
|
||||
int (*on_hit)(struct task *task, struct breakpoint *bp);
|
||||
|
||||
struct library_symbol *libsym;
|
||||
|
||||
union {
|
||||
unsigned char orig_value[BREAKPOINT_LENGTH];
|
||||
#if HW_BREAKPOINTS > 0
|
||||
|
||||
4
dwarf.c
4
dwarf.c
@ -403,7 +403,7 @@ static inline int dwarf_readw(struct dwarf_addr_space *as, arch_addr_t *addr, ar
|
||||
int ret;
|
||||
|
||||
if (is_64bit) {
|
||||
uint64_t u64;
|
||||
uint64_t u64 = 0;
|
||||
|
||||
ret = dwarf_read64(as, addr, &u64);
|
||||
|
||||
@ -411,7 +411,7 @@ static inline int dwarf_readw(struct dwarf_addr_space *as, arch_addr_t *addr, ar
|
||||
*valp = u64;
|
||||
}
|
||||
else {
|
||||
uint32_t u32;
|
||||
uint32_t u32 = 0;
|
||||
|
||||
ret = dwarf_read32(as, addr, &u32);
|
||||
|
||||
|
||||
@ -70,6 +70,9 @@ static int set_breakpoint_addr(struct task *task, arch_addr_t addr, unsigned int
|
||||
addr &= 0xffffffff;
|
||||
#endif
|
||||
|
||||
if (task->arch.hw_bp[n] == addr)
|
||||
return 0;
|
||||
|
||||
ret = ptrace(PTRACE_POKEUSER, task->pid, offsetof(struct user, u_debugreg[n]), addr);
|
||||
if (ret) {
|
||||
if (errno != ESRCH) {
|
||||
@ -77,6 +80,9 @@ static int set_breakpoint_addr(struct task *task, arch_addr_t addr, unsigned int
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
task->arch.hw_bp[n] = addr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -187,6 +193,11 @@ int is_64bit(struct mt_elf *mte)
|
||||
|
||||
int arch_task_init(struct task *task)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for(i = 0; i < HW_BREAKPOINTS; ++i)
|
||||
task->arch.hw_bp[i] = 0;
|
||||
|
||||
return _apply_hw_bp(task, 0);
|
||||
}
|
||||
|
||||
|
||||
@ -52,6 +52,7 @@ struct context {
|
||||
|
||||
struct arch_task_data {
|
||||
unsigned long dr7;
|
||||
unsigned long hw_bp[HW_BREAKPOINTS];
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
74
task.h
74
task.h
@ -38,53 +38,29 @@
|
||||
#include "report.h"
|
||||
|
||||
struct task {
|
||||
struct rb_node pid_node; /* red/black tree node for fast pid -> struct task */
|
||||
/* red/black tree node for fast pid -> struct task */
|
||||
struct rb_node pid_node;
|
||||
|
||||
/* process id */
|
||||
pid_t pid;
|
||||
|
||||
/* points to the leader thread of the POSIX.1 task */
|
||||
struct task *leader;
|
||||
|
||||
/* current pendig event */
|
||||
struct event event;
|
||||
|
||||
unsigned int stopped:1;
|
||||
unsigned int traced:1;
|
||||
unsigned int was_stopped:1;
|
||||
unsigned int is_64bit:1;
|
||||
unsigned int attached:1;
|
||||
unsigned int deleted:1;
|
||||
|
||||
/* Dictionary of breakpoints */
|
||||
struct dict *breakpoints;
|
||||
|
||||
struct breakpoint *breakpoint;
|
||||
struct library_symbol *libsym;
|
||||
struct context context; /* process context (registers, stack) */
|
||||
struct context saved_context; /* context for fetch_param() */
|
||||
struct breakpoint *breakpoint;
|
||||
|
||||
unsigned int threads; /* set in leader: number of threads including the leader */
|
||||
unsigned int threads_stopped; /* set in leader: number of stopped threads including the leader */
|
||||
|
||||
/* linked list of libraries, the first entry is the executable itself */
|
||||
struct list_head libraries_list;
|
||||
|
||||
void *backtrace;
|
||||
|
||||
/* struct task chaining. */
|
||||
struct list_head leader_list;
|
||||
|
||||
/* points to the leader thread of the POSIX.1 task */
|
||||
struct task *leader;
|
||||
|
||||
/* Thread chaining to leader */
|
||||
struct list_head task_list;
|
||||
|
||||
/* current pendig event */
|
||||
struct event event;
|
||||
|
||||
/* pointer to a breakpoint which was interrupt by a signal during skip */
|
||||
struct breakpoint *skip_bp;
|
||||
|
||||
/* only used in leader: bit mask for used hw breakpoints */
|
||||
unsigned long hw_bp_mask;
|
||||
|
||||
/* array of addresses of hw breakpoints */
|
||||
struct breakpoint *hw_bp[HW_BREAKPOINTS];
|
||||
|
||||
/* os specific task data */
|
||||
#ifdef OS_HAVE_PROCESS_DATA
|
||||
@ -95,6 +71,36 @@ struct task {
|
||||
#ifdef TASK_HAVE_PROCESS_DATA
|
||||
struct arch_task_data arch;
|
||||
#endif
|
||||
|
||||
/* pointer to a breakpoint which was interrupt by a signal during skip */
|
||||
struct breakpoint *skip_bp;
|
||||
|
||||
/* array of addresses of hw breakpoints */
|
||||
struct breakpoint *hw_bp[HW_BREAKPOINTS];
|
||||
|
||||
/* set in leader: number of stopped threads including the leader */
|
||||
unsigned int threads_stopped;
|
||||
|
||||
/* set in leader: dictionary of breakpoints */
|
||||
struct dict *breakpoints;
|
||||
|
||||
/* set in leader: backtrace pimpl */
|
||||
void *backtrace;
|
||||
|
||||
/* linked list of libraries, the first entry is the executable itself */
|
||||
struct list_head libraries_list;
|
||||
|
||||
/* Thread chaining to leader */
|
||||
struct list_head task_list;
|
||||
|
||||
/* set in leader: number of threads including the leader */
|
||||
unsigned int threads;
|
||||
|
||||
/* only used in leader: bit mask for used hw breakpoints */
|
||||
unsigned long hw_bp_mask;
|
||||
|
||||
/* struct task chaining. */
|
||||
struct list_head leader_list;
|
||||
};
|
||||
|
||||
/* PROC underwent an exec. This is a bit like task_destroy
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user