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卷到了,我打算明天早晨把去年的卷子打印出来,然后猛猛做。我觉得调整状态最好的办法就是做数学。明天至少做两套吧。
得赶快把白天的学习状态调整回来,我计组专业课还没学明白呢。