Delve 是go语言的一款调试器
调试方式
- 命令行调试
- 配合goland等ide进行remote debug
所谓猴子补丁就是在程序运行的过程中动态的修改一些模块、类、方法,而不是在静态代码中去修改相应的实现
|
|
golang monkey
http://xiaorui.cc/archives/5128
https://studygolang.com/articles/11296
基本结构
trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于捅进和排序大量的字符串,所以经常被搜索引擎系统用于文本词频统计
优点
最大限度的减少无畏的字符串比较,查询效率比哈希表高
![](http://pic.aipp.vip/20200404194244.png)
核心思想
空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的
基本性质
根节点不包含字符,除根节点外每一个节点都只包含一个字符
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串
每个节点的所有子节点所有的字符都不相同
|
|
汇编
通用寄存器使用惯例
rbp 栈帧指针寄存器,用于标识当前栈帧的起始位置
rsp 栈指针寄存器,通常指向栈顶位置,堆栈的pop和push操作就是通过改变rsp的值即移动堆栈指针位置来实现的
rax 结果寄存器,通常用于存储函数调用的返回结果,同时也用于乘法和除法指令中。
[](https://zhuanlan.zhihu.com/p/27339191)
![](http://pic.aipp.vip/20200104165359.png)
EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。
EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址。
ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
EDX 则总是被用来放整数除法产生的余数。
ESI/EDI分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.
EBP是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:
函数的调用
子函数调用时,调用者与被调用者的栈帧结构如下图所示:
![](http://pic.aipp.vip/20200105034810.png)
在子函数调用时,执行的操作有:父函数将调用参数从后向前压栈 -> 将返回地址压栈保存 -> 跳转到子函数起始地址执行 -> 子函数将父函数栈帧起始地址(%rpb) 压栈 -> 将 %rbp 的值设置为当前 %rsp 的值,即将 %rbp 指向子函数栈帧的起始地址。
函数的返回
![](http://pic.aipp.vip/20200105034946.png)
函数返回时,我们只需要得到函数的返回值(保存在 %rax 中),之后就需要将栈的结构恢复到函数调用之差的状态,并跳转到父函数的返回地址处继续执行。由于函数调用时已经保存了返回地址和父函数栈帧的起始地址,要恢复到子函数调用之前的父栈帧,我们只需要执行以下两条指令:
### 指令和运算
#### 计算机指令
#### 指令跳转
#### 函数调用
stack overflow
栈空间溢出,通常两个原因
1.调用层级过多,导致stack无法容纳
2.栈上分配了过大的数据
优化方式
1.编译器自动优化,增加-O参数进行函数内联
#### ELK和静态链接
目标文件
#### 程序内存装载
查看内存页大小
$ getconf PAGE_SIZE
#### 动态链接
采用共享链接库方式公用大量公共库,减少内存使用,二来还可以动态编译
有两种方式实现动态链接
1.PLT(Procedure Link Table)+GOT(Global Offset Table)
#### 二进制编码
正数的原码、反码和补码都相同。
负数原码和反码的相互转换:符号位不变,数值位按位取反。
负数原码和补码的相互转换:符号位不变,数值位按位取反,末位再加1。
11-12 nginx
http框架初始化
http框架
由核心模块ngx_http_module、两个http模块ngx_http_core_module、ngx_http_upstream_module构成
http框架要完成那些工作
1.处理所有http块配置项
2.监听web端口处理连接时间、可读时间、可写事件等
3.有状态机来分析接收到的TCP字符是否是完整的HTTP包
4.根据接收到的URI和HTTP头按照所在阶段准确分发到某一个http模块,从而调用它的回调方法来处理请求
5.向HTTP模块提供必要工具方法,可以处理网络I/O、磁盘I/O
6.提供upstream机制帮助http模块访问第三方服务
7.提供subrequest机制帮助http模块实现子请求
介入content阶段两种方式(381页)
如果希望方法应用于所有用户请求,应该在ngx_http_module_t接口的postconfiguration方法宏,向ngx_http_core_main_conf_t结构体的phases[NGX_HTTP_CONTENT_PHASE]动态数组中添加ngx_http_handler_pt处理方法
如果希望方法仅应用于URL匹配的某些用户请求,应该在一个location下配置项的回调方法中,把ngx_http_handler_pt方法设置到ngx_http_core_loc_conf_t结构体的handler中
http是如何介入事件处理的
ngx_http_block(配置项http的解析方法)
ngx_http_optimize_servers
ngx_http_init_listening
ngx_http_add_listening(将监听端口的handler设置为ngx_http_init_connection)
ngx_http_init_connection(新连接建立后,调用监听端口的handler, ls->handler(c))
http框架的初始化流程(382页)
|
|
数据的逻辑结构
集合: 元素间除同属一个集合外,无其他关系
线性结构: 一个对一个,如线性表、栈、队列
树形结构: 一个对多个,如树
图结构: 多个对多个,如图
类型
定义
简短模式
简短模式并不总是重新定义变量,也饿能是部分退化的赋值操作
退化赋值的前提条件是: 最少有一个新变量被定义,且必须是同一作用域
常量
值类型
引用类型
slice
map
channel
function
interface
别名
byte int8
rune int32
别名可以直接赋值
自定义类型
无法继承基础类型的方法,与基础类型是完全无关的两个类型
类型转换
(转换类型)()