堆栈

为什么我的堆栈上会有奇怪的函数名?(关于符号的讨论)

半城伤御伤魂 提交于 2019-12-05 23:01:35
符号可以包含有关全局变量、局部变量、函数名、参数、结构和源行号的信息。符号有三种类型:导出符号、pdb符号(公共符号)和专用pdb符号(专用符号)。 导出符号是dll本身的一部分。例如,ntdll.dll和kernel32.dll将其函数的很大一部分公开为导出符号,因此可以将它们称为API,但是在进程中发现的大多数dll都有一组非常小的导出符号。通常导出符号不包含函数的参数信息,并且由于很少有函数以这种方式公开,因此当只有导出符号时,您不能真正依赖堆栈的有效性。 公共符号包含一些基本符号,如函数名和全局变量,但同样,并非所有函数名都在公共符号中公开。dll的开发人员选择公开什么作为公共符号,因此他/她可以隐藏任何他们认为会泄露太多有关实现信息的内容。私人符号包含第一段中列出的几乎所有内容 调试时,通过将dll/exe链接到符号文件的GUID,符号与相应的dll或exe匹配。这意味着,如果符号搜索路径中有多个ntdll.pdb,调试器将知道哪个对应于特定版本的ntdll.dll。搜索路径由.sympath指定,除sympath中列出的内容外,调试器还将查找加载dll的目录以及环境变量 _NT_SYMBOL_PATH 中给定的路径中的任何内容。 如果符号是错误的的时候会发生什么? 让我们看看这个带有mscorsvr.dll公共符号的堆栈: 54 Id: 62c.1590 Suspend

集合类源码(三)Collection之List(CopyOnWriteArrayList, Stack)

家住魔仙堡 提交于 2019-12-05 19:13:41
CopyOnWriteArrayList 功能 全名 public class CopyOnWriteArrayList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable 简述 ArrayList的线程安全变体,其中所有的可变操作(添加、修改等)都是通过创建底层数组的新副本来实现的。 方法 // 返回列表里元素的数量 public int size() // 如果此列表不包含任何元素,则返回true。 public boolean isEmpty() // 如果此列表包含至少一个指定的元素,则返回true。 public boolean contains(Object o) // 返回该列表中指定元素第一次出现的索引,如果该列表不包含该元素,则返回-1。 public int indexOf(Object o) // 返回该列表中指定元素第一次出现时的索引(从指定索引向前搜索),如果没有找到该元素,则返回-1。 public int indexOf(E e, int index) // 返回该列表中指定元素的最后一次出现的索引,如果该向量不包含该元素,则返回-1。 public int lastIndexOf(Object o) // // 返回此列表中指定元素的最后一次出现的索引

面试题思考:Stack和Heap的区别 栈和堆的区别

让人想犯罪 __ 提交于 2019-12-05 17:03:06
堆栈的概念:   堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。要点:堆,队列优先,先进先出(FIFO—first in first out)。栈,先进后出(FILO—First-In/Last-Out)。 堆和栈的区别: 一、堆栈空间分配区别:   1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;   2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。 二、堆栈缓存方式区别:   1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;   2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。 三、堆栈数据结构区别:   堆(数据结构):堆可以被看成是一棵树,如:堆排序;   栈(数据结构):一种先进后出的数据结构。 Java中栈和堆的区别:   栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。  

【线程dump详解jstack&full gc】

半城伤御伤魂 提交于 2019-12-05 16:35:39
一、jstack命令 jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁, Deadlock(重点关注) 执行中, Runnable 等待资源, Waiting on condition(重点关注) 等待获取监视器, Waiting on monitor entry(重点关注) 暂停, Suspended 对象等待中, Object.wait() 或 TIMED_WAITING 阻塞, Blocked(重点关注) 停止, Parked 下面我们先从第一个例子开始分析,然后再列出不同线程状态的含义以及注意事项,最后再补充两个实例。 综合示范一: Waiting to lock 和 Blocked 实例如下: "RMI TCP Connection(267865)-172.16.5.25" daemon prio=10 tid=0x00007fd508371000 nid=0x55ae waiting for monitor entry [ 0x00007fd4f8684000 ] java.lang.Thread.State: BLOCKED (on object monitor) at org.apache.log4j.Category.callAppenders(Category.java:201) - waiting to lock

Bran的内核开发教程(bkerndev)-08 中断服务程序(ISR)

牧云@^-^@ 提交于 2019-12-05 14:33:20
中断服务程序(ISR)   中断服务程序(ISR)用于保存当前处理器的状态, 并在调用内核的C级中断处理程序之前正确设置内核模式所需的段寄存器。而工作只需要15到20行汇编代码来处理, 包括调用C中的处理程序。我们还需要将IDT条目指向正确的ISR以正确处理异常。   异常是导致处理器无法正常执行的特殊情况, 比如除以0结果是未知数或者非实数, 因此处理器会抛出异常, 这样内核就可以阻止进程或任务引起任何问题。如果处理器发现程序正尝试访问不允许其访问的内存, 则会引起一般保护错误。当你设置内存页时, 处理器将会产生页面错误, 但这是可以恢复的: 你可以将内存页映射到错误的地址(但这需要另开一篇教程来讲解)。   IDT的前32个条目与处理器可能产生的异常对应, 因此需要对其进行处理。某些异常会将另一个值压入堆栈中: 错误代码, 该值为每个异常的特定代码。 Exception # Description Error Code? 0 Division By Zero Exception No 1 Debug Exception No 2 Non Maskable Interrupt Exception No 3 Breakpoint Exception No 4 Into Detected Overflow Exception No 5 Out of Bounds Exception

线上服务器CPU彪高的调试方式

假如想象 提交于 2019-12-05 11:46:22
原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接: https://app.yinxiang.com/shard/s17/nl/19391737/2fee7b91-fc6e-4e96-838a-b6926b422368 线上服务器CPU彪高的调试方式 1. 使用TOP获取对应的CPU彪高的进程ID 2. top -p 8948 -H 查看8948进程所对应的所有线程,查看引起CPU彪高的线程PID,此处为9037 3. jstack 8948 >/home/xiaoi/8948thread1.txt 打印当前的线程堆栈信息至txt文件当中(尽可能的将2,3步骤同时进行,否则可能出现top所查看得到的线程ID,在导出堆栈信息时已经不再引起CPU彪高了) 4.将所得到的线程PID转换为16进制,如此处的9037转换为16进制后的结果为234d(堆栈信息中存储的是16进制的线程ID,而我们在通过TOP获取到的线程ID为10进制的ID,故需要做一下转换操作) 5.得到对应的转换为16进制后的线程ID为 234d,此时使用vim 查看对应的8948thread1.txt堆栈文件,直接搜索 ?234d 查看对应的234d线程的堆栈信息,发现线程是持续的 RUNNABLE运行状态,查看异常可知是代码底层所调用的谷歌文本对比插件所引起的死循环导致 使用

crashlog解析-iOS

梦想的初衷 提交于 2019-12-05 06:34:49
Crashlog 解析 对于从事iOS移动端测试的同学来说,应用crash十分常见。对于必现crash,通过必现路径复现crash就能定位问题,但对于偶现crash、压力测试crash或者线上crash,就只能通过crashlog来分析,本文介绍iOS端crashlog解析的一些通用知识点。 (做个笔记,以百度地图为例并不适用所有) 1. Crashlog 获取方式 1.1 连接 Xcode 直接读取 crashlog Mac电脑安装Xcode开发平台,通过USB线连接手机与电脑,点击Xcode→Window→De vices and Simulators进入如下界面 (以Xcode9为例)。 图1.1 再点击View Device Logs,读取手机中的crashlog文件。 图1.2 找到对应时间点且process名称为对应app(比如百度地图为IphoneCom)的crashlog文件,右键导出即可。 图1.3 1.2 通过手机直接复制 如果是线上用户主动反馈的crash,那么可能就无法通过上述方式获取crashlog文件,可以让用户进入隐私→诊断与用量→诊断与用量数据查看本地crashlog(iOS10),找到对应时间点且process名称为对应app(比如百度地图为IphoneCom)的文件,并通过手动复制后发送给我们,然后保存成.crash文件。这里有几点需要说明: ①

集合家族——stack

别来无恙 提交于 2019-12-05 05:21:15
一、概述   在 Java 中 Stack 类表示 后进先出 (LIFO)的对象堆栈。栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的   它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确 定到堆栈顶距离的 search 方法。   因为它继承自Vector,那么它的实现原理是以 数组 实现堆栈的。 二、继承关系   java.lang.Object 继承者 java.util.AbstractCollection<E> 继承者 java.util.AbstractList<E> 继承者 java.util.Vector<E> 继承者 java.util.Stack<E> 所有已实现的接口: Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess 三、Stack 对 Vector 进行扩展的五个操作 四、源码分析 public class Stack<E> extends Vector<E> { /** * 创建一个空堆栈。 */ public Stack() { } /** * 把项压入堆栈顶部

Android开发指南-框架主题-基础知识

谁都会走 提交于 2019-12-05 04:44:03
应用程序基础 关键类 Activity Service BroadcastReceiver ContentProvider Intent Android应用程序使用Java做为开发语言。aapt工具把编译后的Java代码连同其它应用程序需要的数据和资源文件一起打包到一个Android包文件中,这个文件使用.apk做为扩展名,它是分发应用程序并安装到移动设备的媒介,用户只需下载并安装此文件到他们的设备。单一.apk文件中的所有代码被认为是一个应用程序。 从很多方面来看,每个Android应用程序都存在于它自己的世界之中: 默认情况下,每个应用程序均运行于它自己的Linux进程中。当应用程序中的任意代码开始执行时,Android启动一个进程,而当不再需要此进程而其它应用程序又需要系统资源时,则关闭这个进程。 每个进程都运行于自己的Java虚拟机(VM)中。所以应用程序代码实际上与其它应用程序的代码是隔绝的。 默认情况下,每个应用程序均被赋予一个唯一的Linux用户ID,并加以权限设置,使得应用程序的文件仅对这个用户、这个应用程序可见。当然,也有其它的方法使得这些文件同样能为别的应用程序所访问。 使两个应用程序共有同一个用户ID是可行的,这种情况下他们可以看到彼此的文件。从系统资源维护的角度来看,拥有同一个ID的应用程序也将在运行时使用同一个Linux进程,以及同一个虚拟机。