在linux中完成对习题 6.5 的调试。习题6.5/*badprog.c 错误地访问内存*/ #include<stdio.h> #include <stdlib.h> int main(int argc, char **argv) { char *p; int i; p=mal1oc(30); strcpy(P,"not 30 bytes"); printf("p=<%s>\n",p); if(argc==2){ if(strcmp(argv[1],"-b")==0) p[50]='a'; else if(strcmp(argv[1],"-f")==0){ free(p); p[0]='b'; } } /*free(p);*/ return 0; }
时间: 2024-04-27 14:25:05 浏览: 100
首先,需要在代码中加入头文件<string.h>,以包含strcpy和strcmp函数的声明。
然后,编译代码时需要加上调试选项“-g”,例如:
gcc -g badprog.c -o badprog
接下来,在命令行中运行程序时,可以使用GDB进行调试。例如:
gdb badprog
然后使用“run”命令运行程序,如果程序崩溃了,GDB会停止程序并给出崩溃信息。可以使用“backtrace”命令查看调用堆栈,以及使用“print”命令查看变量的值。
在这个程序中,如果使用“-b”选项,会访问p数组的第50个元素,超出了分配的内存范围,导致程序崩溃。如果使用“-f”选项,会在释放p指向的内存后继续使用p指针,也会导致程序崩溃。注释掉最后的“free(p)”语句可以避免这个问题,但是会导致内存泄漏。
在GDB中,可以使用“break”命令设置断点以在特定位置停止程序的执行。例如,在main函数中添加一个断点:
(gdb) break main
然后使用“run”命令运行程序,程序在main函数的开头停止。可以使用“print”命令查看变量的值,例如:
(gdb) print p
可以使用“next”命令逐行执行代码,例如:
(gdb) next
可以使用“step”命令跳入函数中执行,例如:
(gdb) step
如果程序崩溃了,可以使用“backtrace”命令查看调用堆栈,例如:
(gdb) backtrace
可以使用“quit”命令退出GDB调试。
阅读全文