gdb命令的常用调试选项

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+"

原文地址:https://www.cnblogs.com/edgarli/p/2691680.html