20155320 信息安全系统设计第二周课堂考试总结及myod的实现

第二周测试一二已在课上提交

第二周测试3-gdb测试

  1. 用gcc -g编译vi输入的代码
  2. 在main函数中设置一个行断点
  3. 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
  4. 提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

首先我再次巩固了一遍cgdb调试的知识。

  • b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
  • run 开始运行程序
  • bt 打印函数调用堆栈
  • p 查看变量值
  • c 从当前断点继续运行到下一个断点
  • n 单步运行
  • s 单步运行
  • quit 退出CGDB
  • 四种断点的设法

1.条件断点:b fxx(函数名)

2.条件断点:b 12 if i=5000

  1. 行断点:b 行号

4.临时断点:tb 行号

所以我输入了b 13 if i==2660 设置了条件断点循环次数为学号的一半

码云代码

截图如下:

第二周测试4-静态库的测试

  1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?

  2. 提交静态库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

首先通过博客linux下制作静态库和动态库的方法

学习了一下静态库的设计方法:

1.把代码编译为目标文件形式(形如):

gcc -c liberr.c -o liberr.o

2.使用工具ar创建一个存档文件:

ar rcs mymath5320.a sub5320.o add5320.o mul.o div.o

3.编译程序时把程序和mymath.a链接起来:

gcc -static -o link5320 main.o mymath.a

4.运行link5320

./link5320

截图如下:

第二周测试5-共享库

  1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库? main.c如何使用mymath.so?

  2. 提交共享库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息

步骤如下:

1.创建一个共享目标文件

gcc -shared -fpic -o mymath.so add5320.c sub5320.c mul.c div.c

2.创建可执行目标文件

gcc -o link main.c ./mymath.so

3.运行link

./link

截图如下:

第二周测试6-Makefile(已在蓝墨云上提交)

1 写出编译上面vi编辑代码的makefile,编译出来的目标文件为testmymath, 只用显式规则就可以.

2 提交Make过程截图,要全屏,包含自己的学号信息

首先我找了个博客教程Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入)

截图如下:

myod

1 复习c文件处理内容

2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能

  1. main与其他分开,制作静态库和动态库

  2. 编写Makefile

5 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息

6 在博客园发表一篇博客,重点写遇到的问题和解决过程

代码码云链接

head.h

#ifndef HEAD_H
#define HEAD_H
void od(char STR[],int);
#endif

myod.c

主要实现读取和关闭文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
//char filepath[100]; FILE *fp;
fp=fopen("test.txt","rb");
if(fp==NULL){
printf("Failure to open file\n");
return 0;
}
char ch;
char STR[1000];
int i,n;
i=0;
while((ch=fgetc(fp))!=EOF){
STR[i]=ch;
i++;
//putchar(ch);
}
STR[i]='\0';
//printf("%d",i);
fclose(fp);
od(STR,i);
}

od.c

用于实现文件中字符逐个输出以及od -tx -tc 的功能

#include"head.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void od(char STR[1000],int i)
{
int k=1;
int j=0;
int m=0;
int line=0;
printf("%06d ",line);
putchar(STR[0]);
for(k=1;k<=i;k++){
if(k%16!=0&&STR[k]!='\0'){
if(STR[k]!='\n')
{
printf(" %2c",STR[k]);
continue;
}
else{
printf(" \\n");
continue;
}
}
else{
printf("\n ");
for(j=m;j<k;j++){
printf(" %02x",STR[j]);
}
printf("\n%06d",k+2); m=k;
}
}
printf("\n");
}

PS:题目隐含的要求

  • 每行最多输出16个字符
  • ASCII码需以16进制形式表示
  • 每行前需输出当前字符个数

编程中遇到的问题

问题1:编程完毕运行时出现如下图的结果:

解决方法:我先取消myod.c中对od.c的调用,在myod.c中输出字符,输出文件正常,发现问题出现在od.c中,再在od.c中用cgdb调试,发现是在逐个输出字符的循环中有问题,解决完后能正常输出字符,但出现了问题2。

问题2:运行结果如下图:

解决办法:单步调试时,发现了以下几个地方出现了问题

修改前如下:

for(k=0;k<i;k++){
if(k%16!=0&&STR[k]!='\0'){
  • 在循环中k不能从0开始计数,因为这样k%16一开始就等于0了,所以k应该从1开始

  • 由于我STR[]是将整个文件存储成一个字符串,共i个字符,而实际上当k=i时,已经不能进入循环了,这就无法满足i<16也需换行输出ASCII码值的情况,所以k应1<=i,且为使

    '\0'成为文件中字符输出结束的标志,我在myod.c中

STR[i]='\0';

问题3:解决完问题2之后,输出显示如下图:

解决:通过比较我才发现了第三个隐含条件,每行前输出的不是行号而是字符统计。我在od.c 中将line++改为k+2,在输出完ASCII码后增加了一个换行即达到了效果

for(j=m;j<k;j++){
printf(" %02x",STR[j]);
}
printf("\n%06d",k+2);

最后正确的运行结果截图,包括makefile,动态库、静态库链接如下:

总结

这次的考试总体来说都是之前让学习的内容,难度并不大。但是由于对cgdb和链接的掌握不熟练,导致课上测试的时候仍然手忙脚乱。以后的课下学习还需要更加认真,要求实践的内容都要熟练掌握。

同时在这次myod的练习中确实产生了许多麻烦,最开始是文件的读取,当时学c的时候就没学好,这次只好再翻书学了一遍。调试真的很重要,许多问题光看是看不出来的。虽然这次编这个代码耗费了我许多精力,但编完确实感觉受益匪浅。

20155320信息安全系统设计第二周课堂考试总结及myod的实现的更多相关文章

  1. 20155216 2017-2018-1 《信息安全系统设计基础》第二周课堂练习补交以及Myod的实现

    20155216 2017-2018-1 <信息安全系统设计基础>第二周课堂练习补交 课堂测试3:行断点的设置 运行截图: 未完成原因:课前未安装 cgdb 具体步骤: 1.输入命令:gc ...

  2. 20155306 2017-2018-1《信息安全系统设计》第二周课堂测试以及myod的实现

    20155306 2017-2018-1<信息安全系统设计>第二周课堂测试以及myod的实现 第二周课堂测验: (注:前两项在课堂已提交,在此不做详解) 第一项: 每个.c一个文件,每个. ...

  3. 20155322 2017-2018-1《信息安全系统设计》第二周 课堂测试 Linux下C语言实现MYOD

    20155322 2017-2018-1<信息安全系统设计>第二周 课堂测试 Linux下C语言实现MYOD [博客目录] 静态库测试 实现方法 相关资料 操作 动态库测试 实现方法 相关 ...

  4. 20145209刘一阳《JAVA程序设计》第二周课堂测试

    第二周课堂测试 1.if关键字后面的小括号内,表达式的值可以为10.(B) A .true B .false 2.表达式0xaa | 0x55的值为(C) A .FF B .0 C .255 D .1 ...

  5. # 第二周课堂实践以及MyOD

    第二周课堂实践以及MyOD 之前使用的虚拟机出现问题被我删掉了,开始学着使用Mac系统自带的终端.在课堂上出现了问题,询问王雄老师也没有解决,课下先使用了实验楼环境进行实验,后来又在Mac重新进行了尝 ...

  6. # 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod

    20155337 2017-2018-1 <信息安全系统设计基础>第二周课堂实践+myod 因为在课上已经提交了四个实验,还欠缺最后一个实验,反省一下自己还是操作不熟练,平时在课下应该多多 ...

  7. 20155233刘高乐 第二周课堂实践以及MyOD

    1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so? 2. 提交共 ...

  8. 第二周课堂笔记3th and4th

    ---恢复内容开始--- 1.      list列表      可变数据类型 创建列表的方法: A=[“a”,”sda”,”2131”]   直接创建  常用的方法 B=list(“ads”)   ...

  9. 第二周课堂笔记2th

    ---恢复内容开始--- 1. 2.索引取单个值 取多个值叫切片, 切片:取多个值 从左到右取值: 原则:顾头不顾尾 1, a[0:3] abc 2, a[-5:-2] abc 3, a[0:-2] ...

随机推荐

  1. 在Android Studio2.3中配置OpenCV4Android SDK

    在Android Studio2.3中配置OpenCV4Android SDK 一,OpenCV4Android下载地址 [2.4.11]http://onhdz331f.bkt.clouddn.co ...

  2. iOS中 Proxy和的delegate区别

    在ios中使用proxy代理模式,经常容易和delegate委托模式混淆. 委托模式(delegate),是简单的强大的模式,可让一个对象扮演另外对象的行为.委托对象保持到另外对象的引用,并在适当的时 ...

  3. CSS加载性能优化

    将首屏页面要用到的CSS文件,放在页面头部加载,其他模块的CSS可以使用异步加载:loadCSS 和 Preload. 关于preload,推进2篇文章给大家看下: 1.通过rel="pre ...

  4. SHA1WithRSA

    SHA1WithRSA:用SHA算法进行签名,用RSA算法进行加密.   算法说明: 在对进行SHA1算法进行签名后,要求对签名后的数据进行处理,而不是直接进行RSA算法进行加密. 要求把SHA1签名 ...

  5. http协议要素

    1)网络节点: 2)通信信道: 3)操作命令: 4)数据载体:

  6. TensorFlow函数(四)tf.trainable_variable() 和 tf.all_variable()

    tf.trainable_variable() 此函数返回的是需要训练的变量列表 tf.all_variable() 此函数返回的是所有变量列表 v = tf.Variable(tf.constant ...

  7. Js 中的 this

    Js 中 this 的理解   this 是啥 ? this是 JavaScript 语言的一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用; 随着函数使用场合的不同,this ...

  8. python自动化测试框架学习

    今天发现python有多个框架可以用于自动化测试方面,下面整理了下splinter和urllib2框架,对于pywinauto框架和ruby框架先记录下以后需要用到再学习. python有个splin ...

  9. PAT——1065. 单身狗

    “单身狗”是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数N(<=50000),是已知夫妻/伴侣的对数:随后N行 ...

  10. HDU 1116 Play on Words(欧拉回路+并查集)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1116 Play on Words Time Limit: 10000/5000 MS (Java/Ot ...