SpringBoot使用Thymeleaf
[!NOTE]
本教程是《SpringBoot系列基础教程》之一,教程目录:https://laisc7301.github.io/blog/2024/01/29/202401290001SpringBoot%E7%B3%BB%E5%88%97%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/
首先按照图示新建项目:
[!NOTE]
本教程是《SpringBoot系列基础教程》之一,教程目录:https://laisc7301.github.io/blog/2024/01/29/202401290001SpringBoot%E7%B3%BB%E5%88%97%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/
首先按照图示新建项目:
[!NOTE]
本教程是《SpringBoot系列基础教程》之一,教程目录:https://laisc7301.github.io/blog/2024/01/29/202401290001SpringBoot%E7%B3%BB%E5%88%97%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/
首先按照图示新建项目:
如果要将C语言转换为汇编语言,就这样写:
1 | gcc -S <filename> |
如果要将C++语言转换为汇编语言,就这样写:
1 | g++ -S <filename> |
比如:这里有个example.c的文件,就这样写:
1 | gcc -S ./example.c |
要注意命令行里的 S
要大写。
1 | gdb ./test01 |
这样就进入了gdb程序。
命令很简单,就是run:
1 | run |
或者也可以简写成r:
1 | r |
如果不运行run直接打断点调试的话,会遇到下面的错误:
1 | Warning: |
原因在于数据断点的设置有误。在没有用gdb运行(run)过可执行程序之前,使用disasemble指令反汇编出来的汇编语言的左边的地址偏移地址,不是逻辑地址。所以,即使break指令能够设置断点,当GDB运行时也不可能访问到这个地址。也就会出现上面的错误。
数据断点:给某个内存地址设置断点,改变该地址所装内容时会触发断点,运行到该地址时会触发断点。(从网上看的,参考)
而学过操作系统或者微机原理就该知道,程序给出来的只是逻辑地址,不可能直接给物理地址的,物理地址都是由系统将其映射成了逻辑地址。
1 | set disassembly-flavor intel |
1 | disas main |
比如输入disas main
命令后看到了以下的内容:
1 | (gdb) disas main |
如果我要把断点打在<+5>的位置上,就输入以下命令:
1 | break *0x56556195 |
程序将在运行完<+0>,还未运行<+5>的时候停下来。
该命令还可以简写成这样:
1 | b *0x56556195 |
然后输入
1 | run |
开始调试
比如查看eax的值:
1 | info register eax |
运行下面命令:
1 | stepi |
此时输入disas
可以看到运行的位置:
1 | (gdb) disas |
运行下面命令:
1 | continue |
shell中的特殊变量:
变量名:含义$0
:shell或shell脚本的名字
$*
:以一对双引号给出参数列表
$@
:将各个参数分别加双引号返回
$#
:参数的个数
$_
:代表上一个命令的最后一个参数
$$
:代表所在命令的PID
$!
:代表最后执行的后台命令的PID
$?
:代表上一个命令执行后的退出状态
echo $?
:如果返回值是0,就是执行成功;如果是返回值是0以外的值,就是失败。
ln -s [绝对路径] ~/桌面/[快捷方式文件名]
如:
1 | ln -s /mnt/hgfs/vmshared ~/桌面/shared |
只需要一行代码:
1 | res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'}); |
完整的代码示例:
1 | var http = require('http'); |