[rCore学习笔记 05]第0章作业题
作业1
略.
作业2
C语言程序
gcc编译
gcc -o main main.c
编译报错
成功产生异常
main.c: In function ‘main’:
main.c:5:26: warning: division by zero [-Wdiv-by-zero]
5 | printf("1 / 0 = %d",1/0);
| ^
但是仍然产生了 main 这个文件
运行生成的文件
./main
产生异常
Floating point exception (core dumped)
trace生成的文件
strace ./main
产生异常
execve("./main", ["./main"], 0x7fff40f14030 /* 46 vars */) = 0
brk(NULL) = 0x58375b8b2000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffda3430010) = -1 EINVAL (Invalid argument)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7524732c0000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
newfstatat(3, "", {st_mode=S_IFREG|0644, st_size=63807, ...}, AT_EMPTY_PATH) = 0
mmap(NULL, 63807, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7524732b0000
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\237\2\0\0\0\0\0"..., 832) = 832
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
pread64(3, "\4\0\0\0 \0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0"..., 48, 848) = 48
pread64(3, "\4\0\0\0\24\0\0\0\3\0\0\0GNU\0I\17\357\204\3$\f\221\2039x\324\224\323\236S"..., 68, 896) = 68
newfstatat(3, "", {st_mode=S_IFREG|0755, st_size=2220400, ...}, AT_EMPTY_PATH) = 0
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 784, 64) = 784
mmap(NULL, 2264656, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x752473000000
mprotect(0x752473028000, 2023424, PROT_NONE) = 0
mmap(0x752473028000, 1658880, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x28000) = 0x752473028000
mmap(0x7524731bd000, 360448, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1bd000) = 0x7524731bd000
mmap(0x752473216000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x215000) = 0x752473216000
mmap(0x75247321c000, 52816, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x75247321c000
close(3) = 0
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7524732ad000
arch_prctl(ARCH_SET_FS, 0x7524732ad740) = 0
set_tid_address(0x7524732ada10) = 7387
set_robust_list(0x7524732ada20, 24) = 0
rseq(0x7524732ae0e0, 0x20, 0, 0x53053053) = 0
mprotect(0x752473216000, 16384, PROT_READ) = 0
mprotect(0x58375af8f000, 4096, PROT_READ) = 0
mprotect(0x7524732fa000, 8192, PROT_READ) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
munmap(0x7524732b0000, 63807) = 0
--- SIGFPE {si_signo=SIGFPE, si_code=FPE_INTDIV, si_addr=0x58375af8d15c} ---
+++ killed by SIGFPE (core dumped) +++
Floating point exception (core dumped)
gdb调试
gdb main
r命令
使得程序继续运行.
这个0x000055555555515c就是报错的序号
Starting program: /home/winddevil/workspace/homework/homework-0-2/main
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGFPE, Arithmetic exception.
0x000055555555515c in main ()
disassemble 命令
用 gdb 的 disassemble 命令可以看到发生异常的指令.
这里可以直接看到汇编是哪一步出错了.
Dump of assembler code for function main:
0x0000555555555149 <+0>: endbr64
0x000055555555514d <+4>: push %rbp
0x000055555555514e <+5>: mov %rsp,%rbp
0x0000555555555151 <+8>: mov $0x1,%eax
0x0000555555555156 <+13>: mov $0x0,%ecx
0x000055555555515b <+18>: cltd
=> 0x000055555555515c <+19>: idiv %ecx
0x000055555555515e <+21>: mov %eax,%esi
0x0000555555555160 <+23>: lea 0xe9d(%rip),%rax # 0x555555556004
0x0000555555555167 <+30>: mov %rax,%rdi
0x000055555555516a <+33>: mov $0x0,%eax
0x000055555555516f <+38>: call 0x555555555050 <printf@plt>
0x0000555555555174 <+43>: mov $0x0,%eax
0x0000555555555179 <+48>: pop %rbp
0x000055555555517a <+49>: ret
End of assembler dump.
作业3
C语言版本
#include <stdio.h>
#include <unistd.h>
int main()
{
sleep(5);
const char* string = "string you want,make you happy\n";
printf("%s",string);
FILE *output_file = fopen("./output.txt","w");
fputs(string,output_file);
return 0;
}
detail
sleep函数在<unistd.h>里被定义
Rust版本
rust的学习资源
The Rust Programming Language - The Rust Programming Language (rust-lang.org)
程序
// 引入所需的库和模块
use std::io::prelude::*; // 引入所有预定义的输入输出 Trait
use std::fs::File; // 用于文件操作
use std::thread; // 用于线程控制,比如休眠
use std::time::Duration; // 时间持续的表示和计算
fn main() {
// 使用thread::sleep函数使当前线程暂停5秒
// Duration::from_secs将给定的秒数转换为Duration类型
thread::sleep(Duration::from_secs(5));
// 定义一个字符串message,这是我们想要打印和写入文件的内容
let message = "Hello, this message will be printed and saved to a file.";
// 使用println!宏将message打印到控制台
println!("{}", message);
// 尝试创建或打开一个名为"output.txt"的文件
// File::create返回一个Result类型,Ok包含文件句柄,Err包含错误信息
match File::create("output.txt") {
// 如果文件创建成功
Ok(mut file) => {
// 使用file.write_all尝试将message的字节序列写入文件
// message.as_bytes将字符串转换为字节序列
if let Err(e) = file.write_all(message.as_bytes()) {
// 如果写入过程中发生错误,通过eprintln!打印错误信息到标准错误输出
eprintln!("写入文件时发生错误: {}", e);
} else {
// 如果写入成功,打印一条确认信息
println!("信息已成功写入文件。");
}
},
// 如果创建文件失败
Err(e) => {
// 打印错误信息,说明为什么无法创建文件
eprintln!("无法创建文件: {}", e);
}
}
}
detail
在Rust中,当你调用一个可能会失败的操作,如文件操作、网络请求或是其他可能遇到错误的情况时,这些函数往往会返回一个 Result 类型。Result 是 Rust 中用于错误处理的一个枚举类型,它有两个变体:Ok(T) 表示操作成功,其中 T 是成功时返回的数据类型;Err(E) 表示操作失败,其中 E 是错误类型。
因此,当调用如 File::create 这样的函数时,它返回的是一个 Result<File, io::Error> 类型的结果。这意味着你需要处理两种情况:成功时如何处理返回的文件句柄,以及失败时如何处理错误。
使用 match 表达式来处理 Result 是一种常见做法,它可以清晰地表达出对成功和失败情况的处理逻辑。在这个上下文中,Ok 和 Err 不是“必须有”的语法结构,而是当你需要正确处理可能发生的错误时,利用 Result 类型进行错误处理的自然结果。如果不处理 Result,编译器通常会报错,因为它强制程序员显式地考虑所有可能的执行路径,这是 Rust 安全性和可靠性特性的一部分。
如果你确定某个操作不应该失败,并且在失败时愿意让程序 panic(崩溃),可以使用 unwrap 或 expect 方法来简化代码,但这通常只推荐在测试代码或那些你知道确定能成功的场景下使用。在生产代码中,还是应该妥善处理错误,以提高程序的健壮性。
作业4
暂时想不出来
TODO
[rCore学习笔记 05]第0章作业题的更多相关文章
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画 学习目标 熟悉蒙皮动画的术语: 学习网格层级变换 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十一章:模板测试 代码工程地址: https://github.co ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第六章:在Direct3D中绘制
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第六章:在Direct3D中绘制 代码工程地址: https://gi ...
- 《jQuery权威指南》学习笔记之第2章 jQuery选择器
2.1 jQuery选择器概述 2.1.1 什么使选择器 2.1.2 选择器的优势: 代码更简单,完善的检测机制 1.代码更简单 示例2-1 使用javascript实现隔行变色 < ...
- 机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归
机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归 关键字:Logistic回归.python.源码解析.测试作者:米仓山下时间:2018- ...
- C++ GUI Qt4学习笔记05
C++ GUI Qt4学习笔记05 qtc++正则表达式 QIntValidator -- 只让用户输入整数 QDoubleValidator -- 只让用户输入浮 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION) 学习目标 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十七章:拾取
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十七章:拾取 代码工程地址: https://github.com/ ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader) 代码工程 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第七章:在Direct3D中绘制(二)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第七章:在Direct3D中绘制(二) 代码工程地址: https:/ ...
随机推荐
- go强大的垃圾回收机制。
一.C语言中返回函数中局部变量值和指针(1) 在C语言中,一个函数可以直接返回函数中定义的局部变量,其实在函数返回后,局部变量是被系统自动回收的,因为局部变量是分配在栈空间,那为什么还可以返回局部变量 ...
- Geatpy学习笔记1:官方案例
一.入门 1.求解器模式入门 案例 1 import geatpy as ea import numpy as np # 构建问题 r = 1 # 目标函数需要用到的额外数据 @ea.Problem. ...
- 企业签名打包错误+[MICodeSigningVerifier _validateSignatureAndCopyInfoForURL:withOptions:error:]:
一.问题现象 debug连接真机情况下面,编译正常,调试也是正常的. 使用企业签名命令行编译打包 xcodebuild -target dailybuildipa -configuration Dai ...
- 微信小程序跳转重新加载目标页
可用于在首次进入到小程序后就执行性了首页的onLoad方法,等你再去点击其它页面再回来的时候就不会加载onLoad了,比如你跳到登录页后再返回到首页会发现首页啥数据都没加载,所以你在登录那边进行跳转的 ...
- js 实现密码框的查看和隐藏
大江东去,浪淘尽,千古风流人物.故垒西边,人道是,三国周郎赤壁.乱石穿空,惊涛拍岸,卷起千堆雪.江山如画,一时多少豪杰.遥想公瑾当年,小乔初嫁了,雄姿英发.羽扇纶巾,谈笑间,樯橹灰飞烟灭.故国神游,多 ...
- 剑指Offer-59.按之字形顺序打印二叉树(C++/Java)
题目: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 分析: 实际上是二叉树的层次遍历,只不过每一行 ...
- monaco-editor 的 Language Services
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:修能 这是一段平平无奇的 SQL 语法 SELECT id ...
- SD-WAN中二层组网与三层组网的区别
前言 随着企业网络需求的不断增长和变化,SD-WAN作为一种现代网络技术,为企业提供了更灵活.高效的网络解决方案.在SD-WAN中,二层组网和三层组网是两种常见的部署模型,它们有着各自的特点和适用场景 ...
- 支付宝签名和验签使用JSONObject是最优解。json字符串顺序和==符号都一致演示代码
支付宝签名和验签使用JSONObject是最优解.json字符串顺序和==符号都一致演示代码 支付宝spi接口设计验签和返回结果加签注意点,支付宝使用JSONObject对象https://www.c ...
- EthernetIP IO从站设备数据 转 Modbus RTU TCP项目案例
1 案例说明 1. 设置网关采集EthernetIP IO设备数据 2. 把采集的数据转成Modbus协议转发给其他系统. 2 VFBOX网关工作原理 VFBOX ...