堆栈

AWS 基础设施即代码(五)

半城伤御伤魂 提交于 2019-11-27 13:16:22
基础设施即代码 概述 手动配置的挑战:可能因为人为错误导致缺乏可靠性,环境无法完全再现,同时需要额外文档 基础设施即代码,是软件开发中用于创建可重用、可维护、可扩展及可测试基础设施的技术、实践和工具,而不降基础设施定义为捆绑硬件的组件。 基础设施即代码的好处: 可靠性 可再现性 - 可重复性、可重用性 可维护性 一致性 并行化 文档性 环境自动化 只要可能,都应该自动对资源执行预置、终止和配置操作,通过取消手动流程,提高系统的稳定性和一致性、以及组织的效率 使用可释放的资源 利用云计算的动态配置特性,将服务器和其他组件视为临时资源 自动部署相同配置的新资源 终止未使用的资源 自动切换到新的IP地址 测试新资源的更新,然后用更新的资源替代旧资源 AWS Lambda 概述 无需配置和管理任何服务器和应用程序就能运行代码。 只需要上传代码,Lambda就会处理运行并且根据需要自动进行横向扩展 Lambda 是完全托管的计算服务,在响应事件或以事件间隔运行无状态代码 Lambda支持的代码语言 Python Java Node.js (JavaScript) C# Go Lambda 可以支持: 服务器 容量需求 部署 扩展和容错 操作系统和语言更新 指标和日志记录 Lambda 可以实现: 使用自己的代码甚至原生库 并行运行代码 创建后端、事件处理程序和数据处理系统

reversing.kr学习之路-ransomeware

大城市里の小女人 提交于 2019-11-27 13:13:15
ransomeware - writeup 题目来源 http://reversing.kr 题目知识点:upx + 花指令 + 堆栈不平衡 + exe特征码提取key 前言 文章只是记录一下自己在reversing.kr上学习CTF逆向的经历,如果文中出现什么技术错误,烦请各位大佬,在评论中指正。本人技术刚刚入门,菜鸟一枚,大佬勿喷啊~ 正文 首先在网站上下载附件,得到一个zip,里面包含了一个txt、一个exe和一个file。根据txt里面的提示,可以得到exe为加密程序,file为加密后的文件,并且file在加密前应该是一个exe文件。 接下来我就对exe文件进行了分析,使用PEID进行查壳发现,该exe使用了UPX进行加壳,这里大家可以使用ESP定律进行手工脱壳,而我嫌弃麻烦,直接使用UPX工具进行了脱壳,结果如下图。 在经过脱壳之后,exe文件就可以使用IDA进一步分析,但是不巧的是,在对main函数进行反编译时,出现了情况。 是的,你没看错,IDA意思是:“这个函数太大了,劳资分析不了”。 what?还有这种操作?作为一位菜鸟,还真是第一次看到IDA报这种错误。既然分析不了,那就去看看main函数的汇编代码吧。 好吧,出题人,!#@&%……#%,你开心就好啦!在main函数里面充斥了0x37195的无用代码,也可以称之为花指令,反正就是阻止IDA对其进行反编译

浅析堆栈段,BBS段,数据段,代码段

一笑奈何 提交于 2019-11-27 12:36:12
文章目录 1. 进程,线程 2. 堆栈段 3. BBS段 4. 代码段 5. 数据段 6. 例子 7. 总结 1. 进程,线程 所谓进程是指在系统中能独立运行并作为资源分配的基本单位,程序段,数据段和PCB(进程控制块)构成了进程的实体。线程是程序运行的基本单位。 -进程(执行的程序)会占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等。不过进程对这些内存的管理方式因内存用途不同而不同,有些内存是事先静态分配和统一回收的,而有些却是按需要动态分配和回收的。对任何一个普通进程来讲,它都会涉及到以下四种类型的数据段。 2. 堆栈段 堆(heap) :堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)若程序员不释放,则会有内存泄漏,系统会不稳定,Windows系统在该进程退出时由OS释放,Linux则只在整个系统关闭时OS才去释放(参考Linux内存管理)。 栈(stack) : 栈用于存放程序的局部变量,除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以 栈特别方便用来保存/恢复调用现场

c++中关于堆和堆栈的区别

ε祈祈猫儿з 提交于 2019-11-27 11:24:49
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量 的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应 用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉, 那么在程序结束后,操作系统会自动回收。 自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的, 不过它是用free来结束自己的生命的。 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的 C语言中,全局变量又分为初始化的和未初始化的(初始化的全局变量和静态变 量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被 初始化的对象存储区可以通过void*来访问和操纵,程序结束后由系统自行释 放),在C++里面没有这个区分了,他们共同占用同一块内存区。 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许 修改(当然,你要通过非正当手段也可以修改,而且方法很多) 堆和栈究竟有什么区别? 主要的区别由以下几点: 1、管理方式不同; 2、空间大小不同; 3、能否产生碎片不同; 4、生长方向不同; 5、分配方式不同; 6、分配效率不同; 管理方式:对于栈来讲,是由编译器自动管理

Java 堆栈内存的理解

泪湿孤枕 提交于 2019-11-27 11:23:37
Java中变量在内存中的分配 1). 类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便高速访问。静态变量的生命周期—一直持续到整个“系统”关闭 2). 实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量(比如说类实例),然后根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的“物理位置”。实例变量的生命周期–当实例变量的引用丢失后,将被GC(垃圾回收器)列如可回收“名单”中,但并不马上就释放堆中内存 3). 局部变量:局部变量,由声明在某方法,或某代码段里(比如for循环),执行到它的时候在堆中开辟内存,当局变量一旦脱离作用域,内存立即释放 堆内存 什么是堆内存? 堆内存是java内存中的一种,它的作用是用于存储java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放。 堆内存的特点是什么? 第一点:堆其实可以类似的看做是管道,或者说是平时去排队买票的情况差不多,所以堆内存的特点就是:先进先出,后进后出,也就是你先排队好,你先买票。 第二点:堆可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,但缺点是,由于要在运行时动态分配内存,存取速度较慢。 new对象在堆中如何分配?

win32线程栈溢出问题 (一)

雨燕双飞 提交于 2019-11-27 11:17:40
一、什么是线程栈溢出 我们都知道,每一个win32线程都会开辟一个空间,用来临时存储线程执行时所调用的一系列函数的参数、返回地址和局部变量及其他上下文信息。这个空间就是线程的栈区。栈区的容量是有限的,在程序编译链接时,就固定下来了。通过VC++编译的程序,默认的栈区大小是1MB。当我们程序执行时,访问超过了这个空间的边界,就叫栈溢出,又叫 Stack overflow 。这时会产生代码为STATUS_STACK_OVERFLOW(0xC00000FD)的异常,从而导致程序崩溃。注意一定要与栈缓冲区溢出--- STATUS_STACK _BUFFER_OVERRUN(0xC0000409)区别开来。 二、栈溢出的原因 栈溢出是用户模式线程可能会遇到的错误。 有三个可能的原因产生此错误: 线程使用为其保留的整个堆栈。这通常是由无限递归引起的。 线程无法扩展堆栈,因为页文件已最大化,因此无法提交其他页来扩展堆栈。 由于系统内使用以扩展页面文件的短时间内,线程不能扩展堆栈。 当一个线程上运行的函数分配的本地变量时,变量放线程的调用堆栈上。 函数所需的堆栈空间量可能大至所有本地变量的大小的总和。 但是,编译器通常会执行优化,降低函数所需的堆栈空间。 例如,如果两个变量,则在不同的作用域中,编译器可以为这两个这些变量使用相同的堆栈内存。 编译器还可能无法完全消除某些本地变量对计算进行优化。

FreeRTOS 任务栈大小确定及其溢出检测

帅比萌擦擦* 提交于 2019-11-27 10:19:11
以下转载自 https://www.cnblogs.com/yangguang-it/p/7123727.html FreeRTOS 的任务栈设置 不管是裸机编程还是 RTOS 编程,栈的分配大小都非常重要。 局部变量,函数调用时的现场保护和返 回地址,函数的形参,进入中断函数前和中断嵌套等都需要栈空间,栈空间定义小了会造成系统崩溃。 裸机的情况下,用户可以在这里配置栈大小: 为什么是堆中的?因为我们采用的就是动态创建任务的方式。如果静态创建,就和我们自己开辟的空间有关,通常静态创建任务用数组作为容器,但是通常静态创建的方式我们都不使用。 FreeRTOS 的系统栈设置 上面跟大家讲解了什么是任务栈,这里的系统栈又是什么呢?裸机的情况下,凡是用到栈空间的地方 都是在这里配置的栈空间: 在 RTOS 下, 上面两个截图中设置的栈大小有了一个新的名字叫系统栈空间 ,而任务栈是不使用这里的空间的。 任务栈不使用这里的栈空间,哪里使用这里的栈空间呢?答案就在中断函数和中断嵌套。  由于 Cortex-M3 和 M4 内核具有双堆栈指针,MSP 主堆栈指针和 PSP 进程堆栈指针,或者叫 PSP 任务堆栈指针也是可以的。在 FreeRTOS 操作系统中,主堆栈指针 MSP 是给系统栈空间使用的,进 程堆栈指针 PSP 是给任务栈使用的。 也就是说,在 FreeRTOS 任务中

android死机堆栈调试方法

怎甘沉沦 提交于 2019-11-27 10:15:26
这两种方法都不是我发明了,都是网上一些高手公共出来的调试方法,无奈找不到出处的地方了,所以就在此总结一下,以方便android下的调试: 简要说明: android系统中调试Java非常容易,一般遇到错误都在logcat中打印出错时函数的调用关系, 而C库中出错时只看到一些二进制信息,使用gdbserver调试环境搭建又比较复杂。 方法一: 下在介绍一个简单的调试库的方法,当然需要有so库的源代码 举例 a) 错误信息如下,它表示了出错时的函数调用关系(下面调上面的) I/DEBUG ( 634): #00 pc 000078e6 /system/lib/libmultiplayerservice.so I/DEBUG ( 634): #01 pc 000087bc /system/lib/libmultiplayerservice.so I/DEBUG ( 634): #02 pc 0000e94e /system/lib/libsensorservice.so I/DEBUG ( 634): #03 pc 0000a790 /system/lib/libsensorservice.so I/DEBUG ( 634): #04 pc 0000d4b2 /system/lib/libsensorservice.so I/DEBUG ( 634): #05 pc 0000d852

线上问题排查

走远了吗. 提交于 2019-11-27 09:47:15
转自: https://my.oschina.net/zhangxufeng/blog/3017521 Full GC次数过多 首先我们可以使用 top 命令查看系统CPU的占用情况 top - 08:31:10 up 30 min, 0 users, load average: 0.73, 0.58, 0.34 KiB Mem: 2046460 total, 1923864 used, 122596 free, 14388 buffers KiB Swap: 1048572 total, 0 used, 1048572 free. 1192352 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 9 root 20 0 2557160 288976 15812 S 98.0 14.1 0:42.60 java 到了98.8%,此时我们可以复制该进程id 9 查看该进程的各个线程运行情况: top -Hp 9 该进程下的各个线程运行情况如下: top - 08:31:16 up 30 min, 0 users, load average: 0.75, 0.59, 0.35 Threads: 11 total, 1 running, 10 sleeping, 0 stopped, 0 zombie

delphi 多线程编程

我是研究僧i 提交于 2019-11-27 05:02:44
开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解. 先试试这个: procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); end; end; View Code 上面程序运行时, 我们的窗体基本是 "死" 的, 可以在你在程序运行期间拖动窗体试试... Delphi 为我们提供了一个简单的办法(Application.ProcessMessages)来解决这个问题: procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); Application.ProcessMessages; end; end; View Code 这个 Application.ProcessMessages; 一般用在比较费时的循环中, 它会检查并先处理消息队列中的其他消息. 但这算不上多线程, 譬如: 运行中你拖动窗体, 循环会暂停下来...