堆栈

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

这一生的挚爱 提交于 2019-11-28 12:40:54
!analyze命令简介 这个 !analyze扩展显示有关当前异常或错误检查的信息。 用户模式: !analyze [-v] [-f | -hang] [-D BucketID] !analyze -c [-load KnownIssuesFile | -unload | -help ] 内核模式: !analyze [-v] [-f | -hang] [-D BucketID] !analyze -c [-load KnownIssuesFile | -unload | -help ] !analyze -show BugCheckCode [BugParameters] 参数: -v 显示详细输出。 -f 生成!analyze异常输出。 即使调试器未检测到异常,也可以使用此参数查看异常分析。 -hang 生成!analyze -hang的应用程序输出。当目标遇到错误检查或异常,但分析应用程序挂起的原因与您的问题更相关时,请使用此参数。在内核模式下,!analyze-hang调查系统持有的锁,然后扫描dpc队列链。在用户模式下,!analyze-hang分析线程堆栈,以确定是否有任何线程正在阻塞其他线程。在以用户模式运行此扩展之前,请考虑将当前线程更改为您认为已停止响应的线程(即挂起),因为异常可能已将当前线程更改为其他线程。 -D BucketID

Java多线程-程序运行堆栈分析

怎甘沉沦 提交于 2019-11-28 12:39:46
class文件内容 class文件包含JAVA程序执行的字节码;数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符;文件开头有一个0xcafebabe(16进制)特殊的一个标志。 JVM运行时数据区 线程独占:每个线程都会有它独立的空间,随线程生命周期而创建和销毁 线程共享:所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁 方法区 JVM用来存储加载的类信息、常量、静态变量、编译后的代码等数据。 虚拟机规范中这是一个逻辑区划。具体实现根据不同虚拟机来实现。 如:oracle的HotSpot在java7中方法区放在永久代,java8放在元数据空间,并且通过GC机制对这个区域进行管理 堆内存 堆内存还可以细分为:老年代、新生代(Eden、From Survivor、To Survivor) JVM启动时创建,存放对象的实例。垃圾回收器主要就是管理堆内存。 如果满了,就会出现OutOfMemoryError。 虚拟机栈 虚拟机栈,每个线程都在这个空间有一个私有的空间。 线程栈由多个栈帧(Stack Frame)组成。 一个线程会执行一个或多个方法,一个方法对应一个栈帧。 栈帧内容包含:局部变量表、操作数栈、动态链接、方法返回地址、附件信息等。 栈内存默认最大是1M,超出则抛出StackOverflowError 本地方法栈 和虚拟机栈功能类似

2.5 习题

你离开我真会死。 提交于 2019-11-28 11:21:37
题2.1 8086/8088 通用寄存器的通用性表现在何处?8个通用寄存器各自有何专门的用途?哪些寄存器可作为存储器寻址方式的指针寄存器? 答:8086、8088通用寄存器既可用存储数据,也可用于存放运算的中间值、运算结果。8个通用寄存器的专门用途如下:   AX:字乘法、字除法、字I/O、累加器   AL:字节乘法、字节除法、字节I/0、十进制算术运算   AH:字节乘法、字节除法   BX: 存储器指针   CX:串操作、循环控制中的计数器   CL: 移位计数器   DX:字乘法、字除法、间接I/0   SI: 存储器指针(串操作源指针)   DI:存储器指针(串操作目的指针)   BP:存储器指针(默认为堆栈段)   SP:指令指针 可作为存储器寻址方式指针寄存器为:BX、SI、DI、BP 题2.2 从程序员的角度看,8086/8088有多少个可访问的16位寄存器?有多少个可访问的8位寄存器? 答:AX,BX,CX,DX,SI,DI,BP,SP,DS,CS,ES,SS,IP,FLAG。共14个16位寄存器。AH,AL,BH,BL,CH,CL,DH,DL共8个8位寄存器。 题2.3 寄存器AX与寄存器AH和AL的关系如何?请写出如下程序片段中每条指令执行后寄存器AX的内容: MOV AX,1234H AX=1234H MOV AL,98H    AX=1298H MOV AH

Python3 数据结构

╄→尐↘猪︶ㄣ 提交于 2019-11-28 10:40:56
Python数据结构 列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。 注意:类似 insert, remove 或 sort 等修改列表的方法没有返回值。 将列表当做堆栈使用 列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用 append() 方法可以把一个元素添加到堆栈顶。用不指定索引的 pop() 方法可以把一个元素从堆栈顶释放出来。 嵌套列表解析 python的列表还可以嵌套 元组和序列 集合 集合是一个无序不重复元素的集合,基本功能包括关系测试和消除重复元素。 可以用大括号{}创建集合, 如果要创建一个空集合,就必须使用set()而不是{};后者创建一个空的字典。 字典 序列是以连续的整数为索引,与此不同的是,字典以关键字为索引,关键字可以是任意不可变类型,通过用字符串或数值。 构造函数dict()直接从键值对元组列表中构建字典。 如果有固定的模式,列表推导式指定特定的键值对: 在字典中遍历时,关键字和对应的值可以使用items()方法同时解读出来: 来源: https://www.cnblogs.com/fanx-1995/p/11395468.html

通用寄存器和内存

强颜欢笑 提交于 2019-11-28 10:18:47
计算机在运行时,需要提供数据的容器; 容器由内存和cpu提供,内存提供的容器比较多;cpu提供的容器较少但其中的数据计算速度快; cpu提供的容器就是寄存器,寄存器有特定的数据宽度,决定了该寄存器存储数据的范围; 1.常用的32位寄存器 32位通用寄存器还可以拆分来使用;将低16位当做16位寄存器; 一些16位寄存器也可以继续拆分;高8位和低8位分别当做8位寄存器来使用; 2.mov指令 mov 目标操作数,源操作数 作用:拷贝源操作数到目标操作数 注意: 源操作数可以是立即数、通用寄存器、段寄存器、内存单元; 目标操作数可以是通用寄存器、段寄存器、内存单元; 操作数的宽度必须一样; 源操作数和目标操作数不能同时为内存单元; mov的语法: 3.从内存中读写数据 内存由一段连续的内存单元组成,每个内存单元有8位; 32位机正常的寻址范围为0~FFFFFFFF,也就是4GB; 但这不是确定的,有些内存区域可能被固定无法访问,并且操作系统也可能扩展内存; 数据有3中类型: 字节 ->byte,宽度为8位 字 ->word,宽度为两个字节16位 双字 ->dword,宽度为两个字32位 用指令从内存中读写数据时,需要指明数据的类型 例如: mov dword ptr ds:[0x0012FF34],0x12345678 4.内存寻址的几种方式 1)[立即数] 从内存中读

ucosii使用

我怕爱的太早我们不能终老 提交于 2019-11-28 08:11:37
当需要同时跑多个任务的时候裸机显然不能很好的完成使命,这个时候我们可以给单片机上系统,创建多任务,完成复杂逻辑 一、首先移植uocii在我们的板上,根据mcu型号移植ucosii,需要做相应配置 我用的是ucoii mcu型号是stm32rct6 https://blog.csdn.net/lo_heng/article/details/79127081(移植参考网址) 二、编写任务函数并设置其堆栈大小和优先级等参数。 设置函数堆栈大小,这个需要根据函数的需求来设置,如果任务函数的局部变量多,嵌 套层数多,那么相应的堆栈就得大一些,如果栈设置小了,很可能出现的结果就是 CPU进入 HardFault,遇到这种情况,你就必须把堆栈设置大一点了。另外,有些地方还需要注意堆栈字节对齐的问题,如果任务运行出现莫名其妙的错误(比如用到 sprintf 出错),请 考虑是不是字节对齐的问题。 设置任务优先级,这个需要大家根据任务的重要性和实时性设置,记住高优先级的任务 有优先使用 CPU 的权利。 三、调用 OSInit,初始化 UCOSII,通过调用 OSTaskCreate 函数创建我们的任务。调用 OSStart,启动 UCOSII。 注意:在应用程序中经常有一些代码段必须不受任何干扰地连续运行,这样的代码段叫做临界段 (或临界区)。因此,为了使临界段在运行时不受中断所打断

jvm问题排查工具、命令

半城伤御伤魂 提交于 2019-11-28 06:47:58
dump生成:jmp -dump:live,format=b,file=/tmp/some.bin PID。其中,加上live表示只dump存活的对象。 线程栈信息生成:jstack PID > /tmp/file.txt 找出占用CPU最多的线程: top -p PID -h 找到占用CPU最多的线程号(此命令结果显示为PID,对应jstack里的nid) 获取jstack; 将上面找到的线id转为十六进制形式,通过grep命令可以从jstack里找到相应的线程信息 grep 'nid' -B 10 -A 10 jstack.txt (使用grep获取前后10行信息) MAT使用: Shallow Heap:对象本身占用的空间 Retained Heap:对象本身及它引用依赖的所有对象占用的空间 gc日志相关参数: -Xms30m -Xmx30m -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime -Xloggc:/tmp/gc_%p_%t_.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/ 其中%p为进程ID,%t为时间,示例:gc_pid10442_2019-10-13

Python列表,元组,字典,集合

和自甴很熟 提交于 2019-11-28 05:26:46
  列表   Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。   列表追加数据的方法:append(),extend(数组),insert(位置,值)      将列表当做堆栈使用   表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。用 append() 方法可以把一个元素添加到堆栈顶。用不指定索引的 pop() 方法可以把一个元素从堆栈顶释放出来。例如:      将列表当作队列使用   也可以把列表当做队列用,只是在队列里第一加入的元素,第一个取出来;但是拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快,然而在列表里插入或者从头部弹出速度却不快(因为所有其他的元素都得一个一个地移动)。      列表推导式      列表删除语句:del,pop(),remove()   del 语句   使用 del 语句可以从一个列表中依索引而不是值来删除一个元素。这与使用 pop() 返回一个值不同。可以用 del 语句从列表中删除一个切割,或清空整个列表(我们以前介绍的方法是给该切割赋一个空列表)。例如:      remove()      pop()语句      查看list内置函数   reverse():倒置      sort