堆栈

8 个问题看你是否真的懂 JS

北慕城南 提交于 2019-12-10 11:22:52
JavaScript 是一种有趣的语言,我们都喜欢它,因为它的性质。浏览器是JavaScript的主要运行的地方,两者在我们的服务中协同工作。JS有一些概念,人们往往会对它掉以轻心,有时可能会忽略不计。原型、闭包和事件循环等概念仍然是大多数JS开发人员绕道而行的晦涩领域之一。正如我们所知,无知是一件危险的事情,它可能会导致错误。 接下来,来看看几个问题,你也可以试试想想,然后作答。 问题1:浏览器控制台上会打印什么? var a = 10; function foo() { console.log(a); // ?? var a = 20; } foo(); 问题2:如果我们使用 let 或 const 代替 var,输出是否相同 var a = 10; function foo() { console.log(a); // ?? let a = 20; } foo(); 问题3:"newArray"中有哪些元素? var array = []; for(var i = 0; i <3; i++) { array.push(() => i); } var newArray = array.map(el => el()); console.log(newArray); // ?? 问题4:如果我们在浏览器控制台中运行'foo'函数,是否会导致堆栈溢出错误? function foo(

UCOS学习笔记——堆栈

做~自己de王妃 提交于 2019-12-10 00:00:58
堆栈 Cortex-M3堆栈操作 Cortex-M3使用的是**“向下生长的满栈”**模型。堆栈指针SP指向最后一个被压入堆栈的32位数值。在下一-次压栈时, SP先自减4 ,再存入新的数值,如图2.3.1所示。 POP操作刚好相反:先从SP指针处读出,上一次被压入的值,再把 SP指针自增4 。如图2.3.2所示。 在进入ISR时,CM3会自动把一些寄存器压栈,这里使用的是进入ISR之前使用的SP指针(MSP或者是PSP)。离开ISR后,只要ISR没有更改过CONTROL[1],就依然使用先前的SP指针来执行出栈操作。 双堆栈机制 我们已经知道了CM3的堆栈是分为两个: 主堆栈和进程堆栈 , CONTROL[1]决定如何选择。当CONTROL[1]=0时,只使用MSP, 此时用户程序和异常handler 共享同一个堆栈。这也是复位后的缺省使用方式,如图2.3.3所示。 当CONTROL[1]=1时,线程模式将不再使用PSP,而改用MSP(handler模式永远使用MSP) 。此时,进入异常时的自动压栈使用的是进程堆栈,进入异常handler后才自动改为MSP,退出异常时切换同psp,并日从讲程堆栈十弹出数据,如图2.3.4所示: 在特权级下,可以指定具体的堆栈指针,而不受当前使用堆栈的限制,示例代码如下: MRS RO , MSP ; 读取主堆栈指针到RO MSR MSP , RO

WinDbg常用命令系列---!uniqstack

こ雲淡風輕ζ 提交于 2019-12-09 19:48:54
简介 这个!uniqstack扩展 扩展显示的所有线程的堆栈的所有当前进程,不包括显示为具有重复项的堆栈中。 使用形式 ! uniqstack [ -b | -v | -p ] [ -n ] 参数 -b 将导致显示以包括前三个参数传递给每个函数。 -v 将导致显示以包括帧指针省略 (FPO) 信息。 在基于 x86 的处理器中,还会显示的调用约定信息。 -p 将导致显示堆栈跟踪中包含每个函数的完整参数。 此列表将包括每个参数的数据类型、 名称和值。 这要求的完整符号信息。 -n 导致要显示的帧号码。 环境支持 Windows 2000 Uext.dll Windows XP 及更高版本 Uext.dll 说明 此扩展是类似于 k、 kb、 kc、 kd、 kp、 kP,kv (显示堆栈回溯) 命令,只不过它不会显示重复的堆栈。 这个!uniqstack命令枚举了所有的线程调用堆栈并消除了重复,这样您就可以一眼就知道这几百个线程在做什么。 0:021> !uniqstack Processing 22 threads, please wait . 0 Id: 464.ca8 Suspend: 1 Teb: 7f9dd000 Unfrozen Start: SillyThreadPool!ILT+120(_wmainCRTStartup) (00ed107d) Priority: 0

在没有符号和FPO的情况下遍历堆栈(帧指针省略)

谁说我不能喝 提交于 2019-12-09 18:57:08
下面是应用程序崩溃转储的调用堆栈。报告的崩溃是名为“HelperLibrary”的模块内的访问冲突,我们没有该模块的符号或源代码。调用堆栈看起来不太可能: 0:000> kv ChildEBP RetAddr Args to Child WARNING: Stack unwind information not available. Following frames may be wrong. 0028fcec 74ba339a 7efde000 0028fd38 77479ed2 HelperLibrary+0x1014 0028fcf8 77479ed2 7efde000 776a5346 00000000 kernel32!BaseThreadInitThunk+0xe (FPO: [1,0,0]) 0028fd38 77479ea5 011212b2 7efde000 00000000 ntdll!__RtlUserThreadStart+0x70 (FPO: [SEH]) 0028fd50 00000000 011212b2 7efde000 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [2,2,0]) 除了HelperLibrary+0x1014之外,这里没有其他真正的帧,但是我们非常确定堆栈上应该还有其他代码

JVM内存模型之堆栈

隐身守侯 提交于 2019-12-09 16:10:57
堆heap与栈stack职责 Heap和Stack都是用来在RAM中存放数据的地方,Java 自动管理堆和栈 ,程序员无法干预 栈内存:方法中的一 些 基本类型变量和对象的应用变量 都在栈内存中分配 栈的优势: 存取速度比堆要快 ,仅次于直接位于CPU中的寄存器 缺点:存在栈中的数据大小与生存期必须时确定的,不灵活;栈数据在多个线程或者多个栈之间是不可以共享的 堆内存:一般 new出来的数组,对象之类 都是堆内存分配的。 堆的优势: 在于和动态分配内存大小 ,生存期也不必事先告诉编译器;缺点是要在运行时动态分配内存,存取速度较慢 Java内存区域中比较重要的几个部分:程序计数器,栈,堆,方法区,它们都定义在被称作运行时数据去的区域中 其中程序计数器与栈是随县城启动而生,县城结束而灭亡的,也就属于线程私有。而堆和法方区是由JVM启动时创建且被所有线程共享的。 来源: https://www.cnblogs.com/lhl-shubiao/p/12011335.html

windbg设置调用堆栈显示深度

风流意气都作罢 提交于 2019-12-07 23:14:34
使用windbg调试进程调用堆栈时,有时候会发现调用堆栈显示的不完全,这是因为windbg默认最多显示20帧调用堆栈,可以使用.kframe [StackCount]设置最大的堆栈显示深度。另外也可以使用k系列命令时附加要显示的堆栈深度,k [FrameCount]设置要显示的栈帧数量。之前用的不太熟练,被逼的使用 !for_each_frame [ " CommandString " ] 显示完整的堆栈调用。 来源: CSDN 作者: xbgprogrammer 链接: https://blog.csdn.net/xbgprogrammer/article/details/52085396

Windbg -- 查看调用堆栈

给你一囗甜甜゛ 提交于 2019-12-07 23:11:56
一. 显示堆栈信息 k* 命令 [~ Thread ] k[b |p| P |v] [c] [n] [f] [ L ] [ M ] [ FrameCount ] [~ Thread ] k[b |p| P |v] [c] [n] [f] [ L ] [ M ] = BasePtr [ FrameCount ] [~ Thread ] k[b |p| P |v] [c] [n] [f] [ L ] [ M ] = BasePtr StackPtr InstructionPtr [~ Thread ] kd [ WordCount ] 参数: Thread: 指定显示哪个线程的调用堆栈。如果省略该参数,则显示当前线程的调用堆栈。*显示所有线程的调用堆栈。 b: 显示每个函数的前3个参数。 p: 显示每个函数的所有参数。参数列表包括每个参数的类型、名称、值。 P: 类似于 p 。不同之处在于,每个参数显示在单独的行上面。 n: 显示调用堆栈中每帧的序号(一般称栈帧,如栈帧3)。 FrameCount: 指定显示调用堆栈的帧数,即调用堆栈的深度。默认为16进制格式。默认帧数为0x14=20 二. 切换到指定帧信息 调用堆栈显示出来之后,如果想知道调用某帧时的相关信息,可以使用 .frame 来切换到指定的帧,然后就可以使用如 dv 命令显示局部变量等。 .frame [/c] [/r]

C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)

南楼画角 提交于 2019-12-07 18:36:41
BSS段: (bss segment)通常是指用来存放程序中 未初始化 的 全局变量 的一块内存区域 。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段 :数据段(data segment)通常是指用来存放程序中 已初始化 的 全局变量 的一块内存区域 。数据段属于静态内存分配。 代码段: 代码段(code segment/text segment)通常是指用来 存放 程序 执行代码 的一块内存区域 。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于 只读 , 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些 只读的常数变量 ,例如字符串常量等。 程序段为程序代码在内存中的映射 .一个程序可以在内存中多有个副本 . 堆(heap) :堆是用于 存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减 。当进程调用malloc/free等函数分配内存时, 新分配的内存就被动态添加到堆上(堆被扩张)/释放的内存从堆中被剔除(堆被缩减) 栈(stack) :栈又称堆栈, 存放程序的 局部变量 (但不包括static声明的变量, static 意味着 在数据段中 存放变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。由于 栈的先进先出 特点,所以 栈特别方便用来保存/恢复调用现场 。

VBS 脚本中的字典、动态数组、队列和堆栈

∥☆過路亽.° 提交于 2019-12-06 21:45:45
今天用VBS脚本写了几个程序,用到了字典(Dictionary)、动态数组(ArrayList)、队列(Queue)和堆栈(Stack)。现在写篇Blog总结一下 :-) 1.编写环境 今天突发奇想下载了个gVim来写VBS脚本,我用的版本是7.4的 在写脚本前,需要在gVim的安装根目录下,找到文件“_vimrc”,在里面添加下面三行: set number set softtabstop=4 set tabstop=4 意思分别是“显示行号”、“按退格键一次删掉4个空格”和“设定Tab长度为4个字符” 这个设置类似于Linux系统下文件“.vimrc”的配置 2.字典:Scripting.Dictionary VBS中的字典需要使用Scripting.Dictionary 脚本文件:a.vbs,包含字典的添加、删除、判断键是否存在、修改键、修改值、遍历、统计键值对个数 Option Explicit '建立字典 Dim Dict : Set Dict = CreateObject("Scripting.Dictionary") '添加键值对 Dict.Add "Key1", "Item1" Dict.Add "Key2", "Item2" Dict.Add "Key3", "Item3" '字典中键值对数量 WScript.Echo "字典中现有键值对数量: " & Dict

持续集成与持续部署宝典Part 3:创建集成环境

大城市里の小女人 提交于 2019-12-06 19:57:04
两万余字的系列干货长文,攻下持续集成与持续部署! 通过前两篇文章《持续集成与持续部署宝典Part 1:将构建环境容器化》和《持续集成与持续部署宝典Part 2:创建持续集成流水线》,我们使用Docker创建了一个集中管理的构建环境,它可以应用到任意数量的机器上。接着,我们将环境设置到了Jenkins CI上,自动化处理了源代码的持续构建、打包和测试。在本章中,我们将进一步对流水线进行研究(如下所示),了解如何将项目持续部署到一个长时间运行的测试环境中。除了自动验收测试外,它还将允许人工测试代码。有了这样的环境,你就可以在产品投入生产之前让你的客户或者QA(质量管理员)看到最新的变化。此外,它还是一个构建和部署到生产环境的好方法,我们将这一章中进行介绍。 创建应用程序环境 在我们构建并且测试了应用程序后,可以将它部署到一个长期运行的、潜在面向外部的环境中。这种环境要允许客户或者QA在产品投入生产前查看和测试最新的更改,它也是生产过程中一个重要步骤。有了它,我们能够发现在自动化集成测试中会隐藏起来、只有在真实环境才能发现的bug。我们通常把这样的环境称为QA或集成环境,当然你也可以自己命名。我们将通过以下步骤来创建集成环境: 在Rancher中创建一个集成环境 定义Docker Compose以及Rancher Compose模板 用Rancher创建应用程序堆栈