cc -g -o debug3 debug3.c [调试性编译,生成可调试执行程序]
gdb debug3 [进入gdb调试模式]
(gdb)run [开始运行]
(gdb)backtrace [栈跟踪]
(gdb)print j [打印输出变量j]
(gdb)print a[3] [打印输出a[3]]
(gdb)list [列出程序源代码]
(gdb)help breakpoint [列出与设置断点有关的命令]
(gdb)break 21 [在第21行设置一个断点]
(gdb)run [运行]
(gdb)print array[0] [打印输出array[0]]
(gdb)print array[0]@5 [打印输出指定数目(5)的数组元素]
(gdb)cont [继续执行]
(gdb)display array[0]5 n [display表示每次停在断点n时,就显示数组内容,n不指定则为1]
(gdb)commands n [指定程序在到达断点n时需要执行的调试器命令,n不指定则为1]
>set variable i=i+1 [改变某个变量的值]
>cont [程序在到达断点时就执行cont,即继续执行]
>end [命令设置完毕]
(gdb)quit
总结以上,重要选项:run,,list,print,break,display,cont,commands
在编译时可以加上编译器标志-DDEBUG。加了这个标志,就是定义了DEBUG符号,使得程序中所写的代码比如
#ifdef DEBUG
printf...
#endif
就会获得执行从而进行打印输出信息,如果未加上该标志,编译时将会删除这些调试代码。
1.使用fgets要注意判断最后一个字符是否“\n”,是则字符部分总长度应减1.
char *fgets(char *restrict buf, int n, FILE *restrict fp);
fgets的最后一个参数是一个FILE指针,而不是fd,FILE指针需要通过Fopen得到。
2.open与fopen的区别?都是以路径名为参数,返回值open是fd,fopen返回的是FILE pointer,用于f系列函数。
#include <fcntl.h>
int open(const char *pathname, int oflag, ... /* mode_t mode */ );
oflag值为O_RDONLY/O_WRONLY/O_RDWR/O_APPEND/O_CREAT/O_NONBLOCK/O_DSYNC....
#include <stdio.h>
FILE *fopen(const char *restrict pathname, const char *restrict type);
type值为"r"、"w"、"r+"、"w+"