l3.pdf
这次lab能学到很多关于Linux的知识

info locals

gdb 的 info locals指令,可以显示当前局部变量的信息
list main可以显示main所在的行数
image.png
image.png
想要查看局部变量地址内的内容,如arr,用x/24bx &arr,arr有6个元素,每个元素是个int,一共24个字节,所以这个指令表示打印arr地址处的24byte长度的内容,并用hex方式显示。
image.png
image.png

info args 和 step

gdb的info args和step命令,step表示单步执行,info args打印传入函数的参数信息。
image.png
image.png

backtrace 和 frame

backtrack展示当前正在执行的函数链,会以编号的形式分别展示出来,用frame 编号 就可以选择相应的函数框架,进一步用info locals等打印相应框架下的局部变量等内容。
image.png

up

up可以返回到上一层函数框架
image.png

File I/O

image.png

  1. /*
  2. * File: mywc.c
  3. * ------------
  4. * Read lab3 writeup for more information.
  5. */
  6. #include <error.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #define MAX_LINE_LEN 128
  11. void count_input(FILE *fp)
  12. {
  13. int nlines = 0, nchars = 0;
  14. char line[MAX_LINE_LEN];
  15. char *longest = strdup("");
  16. while (fgets(line, sizeof(line), fp) != NULL) {
  17. nlines++;
  18. int len = strlen(line);
  19. nchars += len;
  20. if (len >= strlen(longest)) {
  21. //longest = line;
  22. free(longest);
  23. longest = strdup(line);
  24. }
  25. }
  26. printf("\nNum lines = %4d\nNum chars = %4d\n" , nlines, nchars);
  27. printf("Longest = %s\n", longest);
  28. free(longest);
  29. }
  30. int main(int argc, char *argv[])
  31. {
  32. FILE *fp;
  33. if (argc == 1) {
  34. fp = stdin;
  35. } else {
  36. fp = fopen(argv[1], "r");
  37. if (fp == NULL) error(1, 0, "%s: no such file", argv[1]);
  38. }
  39. count_input(fp);
  40. fclose(fp);
  41. return 0;
  42. }

对于文件流 fp,不管是从标准输入读取,还是从文件中读取,都可以用相同的方式处理,如上面的代码第46行。
image.png
image.png
image.png

Standard input 和 head

head filename命令打印一个文件的前十行内容,如果没有指定文件名,就会从标准输入读取。
image.png
image.png
ctrl + c 退出。
从标准输入读取时,会讲命令行的输入命令输入 pipelines 中,而不是创建一个文件保存。pipelines是一种Unix-like操作系统里面,用消息传递来进行进程间通信的机制。
image.png

cat

打印文件的内容。如果不加参数,会等待你的输入,并读取标准输入。ctrl c退出。
image.png

sort

排序文件的内容后打印,不修改源文件。如果不加参数,会等待你的输入,按ctrl d表示输入结束,命令会基于行来对你的输入进行排序,然后退出。ctrl c退出。
image.png

stdin

stdin是stdio.h头文件定义好的,是个文件流。
image.png

Stack protector 和

buffer overflow缓冲区溢出,stack smashing栈溢出。
image.png
image.png
image.png
stack-protector是由gcc提供的一个功能。
image.png
如图,-fstack-protector可以打开检测,-fno-stack-protector关掉检测。

stack canary

堆栈并不从地址开头开始,而是空出一些空间,从中间的一些位置开始,以此来防止用堆溢出来进行攻击的蠕虫病毒等,空出来的那部分空间就叫 stack canary。

Valgrind 和 堆溢出

image.png

wc

统计文件的行数,单词数,bytes数。如果参数是 -,则在标准输入中统计,ctrl d表示结束输入。
image.png
image.png
image.png
image.png