NJU-ICS 2024学习随笔PA1_3(监视点)

2024-10-08

new_wp

watchpoint.c

WP* new_wp(){
  if(free_ == NULL){
    printf("No free watchpoint\n");
    assert(free_ != NULL);
  }
    
  WP *now = free_;
  free_ = free_->next;
  return now;
}

free_wp

watchpoint.c

void free_wp(WP* wp){
  WP *now = free_;
  free_ = wp;
  free_->next = now;
  printf("free successful\n");
}

2024-10-09

增加两个函数,一个是输出监视点信息,一个是删除监视点

dispaly_wp

watchpoint.c

void sdb_dispaly_wp(){
  if(head == NULL){
    printf("No using watchpoint\n");
    return;
  }

  WP *p = head;
  while(p){
    printf("Watchpoint NO:%d\nexpr:%s\nlast value:%d\nnow value:%d\n", p->NO, p->expr, p->last_value, p->now_value);
    p = p->next;
  }
}

delete_wp

watchpoint.c

void sdb_delete_wp(int NO){
  if(head->NO == NO){
    WP *p = head;
    head = head->next;
    free_wp(p);
    printf("Delete successful\n");
    return;
  }
  for(WP *p = head; p; p = p->next){
    if(p->next->NO == NO){
      p->next = p->next->next;
      free_wp(p->next);
      printf("Delete successful\n");
      return;
    }
  }
  printf("Cannot find the watchpoint\n");
}

这里给出两种遍历链表的方式,我比较倾向于第二种,设置局部变量可以减少变量名冲突。

 

2024-10-10

sdb_create_wp

watchpoint.c

void sdb_create_wp(char *argc){
  WP *p = new_wp();
  bool success = 0;
  int val = expr(argc, &success);
  if(success){
    strcpy(p->expr, argc);
    p->last_value = val;
    p->next = head;
    head = p;
    printf("Successfully created watchpoint\n");
  }
  else{
    printf("Cannot create watchpoint successfully\n");
    printf("Unrecognized expression\n");
  }
}

cmd_info

sdb.c
static int cmd_info(char *argc){
  /*
      
  */
    
  //Print watchpoint info
  else if(*arg == 'w'){
    sdb_dispaly_wp();
    return 0;
  }
  /*
  
  */
  return 0;
}

cmd_wp

sdb.c
static int cmd_wp(char *argc)
{
  char *arg = strtok(NULL, " ");  /*Extract the first argument*/
  char *arg0 = strtok(NULL, " "); /*Check whether exist more argument*/

  //Print watchpoint info
  if(strcmp(arg, "info") == 0){
    sdb_display_wp();
    return 0;
  }
  /*If the input does not match the format*/
  if (arg0 == NULL){
    printf("Does not match the input format: wp %s SUBCMD.\n", arg);
    return 0;
  }
  else if(*arg == 'd'){
    sdb_delete_wp(atoi(arg0));
  }
  else if (strcmp(arg, "new") == 0){
    sdb_create_wp(arg0);
  }
  else{
    printf("Unknown subcmd\n");
    return 0;
  }
  return 0;
}

在运行new指令的时候会爆段错误,明天debug

我的问题,我自己写完忘了还有一个参数了。

delete还是有点问题,明天调。

2024-10-12

如何打开-fsanitize=address编译选项

nemu目录下执行命令make menuconfig找到Build Options找到Enable address sanitizer空格然后save

然后依次执行

make clean
make
make run

就可以重新编译运行了。 

 

唉?PA1好像结束了。

剩下一个断点等以后用到了再说吧,算是一个小坑待填。

 

最近有点学不下去,心里很浮躁,感觉是被好多奇奇怪怪的东西影响到了心情。张宇8卷到了,我打算明天早晨把去年的卷子打印出来,然后猛猛做。我觉得调整状态最好的办法就是做数学。明天至少做两套吧。

得赶快把白天的学习状态调整回来,我计组专业课还没学明白呢。

posted @ 2024-10-08 23:17  euphria  阅读(24)  评论(0编辑  收藏  举报