使用gdb或者是eclipse调试工具调试程序错误,代码如下: #include <stdio.h> #include <stdlib.h> int main(int argc,char ** argv) { char *p; int i; p=malloc(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-01-23 14:02:32 浏览: 107
调试的错误
这段代码有几个问题:
1. 没有包含头文件 string.h,导致 strcpy 和 strcmp 函数无法编译通过。
2. 在申请内存时,只申请了 30 字节的空间,但是在 strcpy 函数中写入了超过 30 字节的数据,这可能会导致越界访问的错误。
3. 在判断 argc 是否等于 2 后,如果 argv[1] 的值不是 "-b" 或 "-f",则会直接退出程序,没有释放申请的空间,造成内存泄漏。
4. 在 if (strcmp(argv[1],"-b")==0) 语句块中,将 p[50] 赋值为 'a',这也是越界访问的错误。
可以使用 gdb 调试工具来定位这些错误,下面是示例的调试过程:
1. 编译代码,生成可执行文件 a.out:
```
$ gcc -g -o a.out test.c
```
2. 使用 gdb 打开可执行文件:
```
$ gdb a.out
```
3. 设置断点,可以在 main 函数入口处设置断点:
```
(gdb) break main
```
4. 运行程序,可以使用 run 命令或者是 r 命令:
```
(gdb) r
```
5. 程序运行到断点处停止,可以使用 step 命令或 s 命令逐行执行代码,使用 print 命令或 p 命令查看变量的值:
```
(gdb) s
(gdb) p p
```
6. 使用 continue 命令或 c 命令继续执行程序,直到程序崩溃或者是遇到下一个断点。
7. 当程序崩溃时,可以使用 backtrace 命令或 bt 命令查看调用栈,使用 print 命令或 p 命令查看变量的值,以便定位错误。
8. 修改代码,重新编译,再次运行程序,直到没有错误为止。
阅读全文