a lot of print

This commit is contained in:
zy
2023-11-21 04:43:15 -05:00
parent 6921e2bf2f
commit 6c105992fd
3 changed files with 59 additions and 20 deletions

View File

@@ -237,7 +237,7 @@ enum hrtimer_restart check_variable_cb(struct hrtimer *timer) {
do_each_thread(g, p) {
if (p->__state == TASK_RUNNING || __task_contributes_to_load(p) ||
p->__state == TASK_IDLE) {
p->__state == TASK_IDLE || 1) {
tsk_info.et_type = 1; //! todo event type
tsk_info.id = event_id;
tsk_info.tv = vm_record.tv;

View File

@@ -93,9 +93,13 @@ static int copy_stack_frame_remote(struct task_struct *tsk,
struct mm_struct *mm;
mm = get_task_mm(tsk);
if (!mm) return 0;
if (!mm) {
printk("copy_stack_frame_remote %d get_task_mm fail\n", tsk->pid);
return 0;
}
ret = orig_access_remote_vm(mm, (unsigned long)fp, frame, sizeof(*frame), 0);
printk("copy_stack_frame_remote %d ret:%d\n", tsk->pid, ret);
mmput(mm);
return ret;
@@ -107,8 +111,16 @@ static inline void save_stack_trace_user_remote(struct task_struct *tsk,
const void __user *fp = (const void __user *)regs->bp;
int count = 0;
if (in_atomic() || irqs_disabled()) {
return;
if (in_atomic() ) {
printk("save_stack_trace_user_remote %d in_atomic\n",
tsk->pid);
// return;
}
if (irqs_disabled()) {
printk("save_stack_trace_user_remote %d irqs_disabled\n",
tsk->pid);
// return;
}
if (trace->nr_entries < trace->max_entries)
@@ -121,18 +133,33 @@ static inline void save_stack_trace_user_remote(struct task_struct *tsk,
frame.ret_addr = 0;
if (!copy_stack_frame_remote(tsk, fp, &frame)) {
printk("save_stack_trace_user_remote %d copy_stack_frame_remote fail\n",
tsk->pid);
break;
}
if ((unsigned long)fp < regs->sp) break;
if ((unsigned long)fp < regs->sp) {
printk("save_stack_trace_user_remote %d fp < sp count:%d\n", tsk->pid,
count);
break; // 如果fp小于sp说明已经到了栈底退出
}
// 如果返回地址不为0说明是一个有效的栈帧保存返回地址
if (frame.ret_addr) {
trace->entries[trace->nr_entries++] = frame.ret_addr;
} else
break;
printk("save_stack_trace_user_remote %d ret_addr:%lx\n", tsk->pid,
frame.ret_addr);
} else{
printk("save_stack_trace_user_remote %d no ret_addr", tsk->pid);
// break;
continue;
}
if (fp == frame.next_fp) break;
fp = frame.next_fp;
// 如果fp指向自己说明已经到了栈底退出
if (fp == frame.next_fp) {
printk("save_stack_trace_user_remote %d fp == next_fp", tsk->pid);
break;
}
fp = frame.next_fp; // 否则,继续向下遍历
count++;
/**
@@ -204,10 +231,19 @@ static void diagnose_save_stack_trace_user_remote(struct task_struct *tsk,
* Trace user stack if we are not a kernel thread
*/
if (tsk->mm) {
printk("save_stack_trace_user_remote %d mm\n", tsk->pid);
save_stack_trace_user_remote(tsk, &trace);
}
if (trace.nr_entries < trace.max_entries)
trace.entries[trace.nr_entries++] = ULONG_MAX;
printk("save_stack_trace_user_remote %d, stack: [", tsk->pid);
int i = 0;
for (i = 0; i < BACKTRACE_DEPTH; i++)
{
printk("%lx, ", backtrace[i]);
}
printk("]\n");
}
void diag_task_brief(struct task_struct *tsk, task_detail *detail) {
@@ -311,10 +347,10 @@ void diag_task_user_stack(struct task_struct *tsk, user_stack_detail *detail) {
detail->bp = bp;
if (tsk == current) {
// printk("diag_task_user_stack current\n");
printk("diag_task_user_stack %d current\n", tsk->pid);
diagnose_save_stack_trace_user(detail->stack);
} else {
// printk("diag_task_user_stack no current\n");
printk("diag_task_user_stack %d no current\n", tsk->pid);
diagnose_save_stack_trace_user_remote(tsk, detail->stack);
}
}