在linux中调试下面的代码/*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 09:25:06 浏览: 159
SeqList.h #include <stdio.h> //包含标准输入输出流的头文件 #include <assert.h
首先,需要在代码中加入头文件<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)”语句可以避免这个问题,但是会导致内存泄漏。
阅读全文