l3.pdf
这次lab能学到很多关于Linux的知识
info locals
gdb 的 info locals指令,可以显示当前局部变量的信息
list main可以显示main所在的行数

想要查看局部变量地址内的内容,如arr,用x/24bx &arr,arr有6个元素,每个元素是个int,一共24个字节,所以这个指令表示打印arr地址处的24byte长度的内容,并用hex方式显示。
info args 和 step
gdb的info args和step命令,step表示单步执行,info args打印传入函数的参数信息。
backtrace 和 frame
backtrack展示当前正在执行的函数链,会以编号的形式分别展示出来,用frame 编号 就可以选择相应的函数框架,进一步用info locals等打印相应框架下的局部变量等内容。
up
File I/O

/** File: mywc.c* ------------* Read lab3 writeup for more information.*/#include <error.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_LINE_LEN 128void count_input(FILE *fp){int nlines = 0, nchars = 0;char line[MAX_LINE_LEN];char *longest = strdup("");while (fgets(line, sizeof(line), fp) != NULL) {nlines++;int len = strlen(line);nchars += len;if (len >= strlen(longest)) {//longest = line;free(longest);longest = strdup(line);}}printf("\nNum lines = %4d\nNum chars = %4d\n" , nlines, nchars);printf("Longest = %s\n", longest);free(longest);}int main(int argc, char *argv[]){FILE *fp;if (argc == 1) {fp = stdin;} else {fp = fopen(argv[1], "r");if (fp == NULL) error(1, 0, "%s: no such file", argv[1]);}count_input(fp);fclose(fp);return 0;}
对于文件流 fp,不管是从标准输入读取,还是从文件中读取,都可以用相同的方式处理,如上面的代码第46行。

Standard input 和 head
head filename命令打印一个文件的前十行内容,如果没有指定文件名,就会从标准输入读取。

ctrl + c 退出。
从标准输入读取时,会讲命令行的输入命令输入 pipelines 中,而不是创建一个文件保存。pipelines是一种Unix-like操作系统里面,用消息传递来进行进程间通信的机制。
cat
打印文件的内容。如果不加参数,会等待你的输入,并读取标准输入。ctrl c退出。
sort
排序文件的内容后打印,不修改源文件。如果不加参数,会等待你的输入,按ctrl d表示输入结束,命令会基于行来对你的输入进行排序,然后退出。ctrl c退出。
stdin
Stack protector 和
buffer overflow缓冲区溢出,stack smashing栈溢出。


stack-protector是由gcc提供的一个功能。
如图,-fstack-protector可以打开检测,-fno-stack-protector关掉检测。
stack canary
堆栈并不从地址开头开始,而是空出一些空间,从中间的一些位置开始,以此来防止用堆溢出来进行攻击的蠕虫病毒等,空出来的那部分空间就叫 stack canary。
Valgrind 和 堆溢出
wc
统计文件的行数,单词数,bytes数。如果参数是 -,则在标准输入中统计,ctrl d表示结束输入。



