StackOverflowException的常见几种引起的方式

1.类的相互引用

2.方法的循环调用

3.属性Set方法的死循环调用

class Program : IProgram
{
IPerson iPerson = new Person();//类的相互引用
static void Main(string[] args)
{
Person person = new Person();
person.InfiniteRecursion(1);//方法的循环调用
person.Name = "Ryzen";
person.Age = ;
person.Sex = "男";//属性Set方法的死循环调用
Program program = new Program();
Console.WriteLine(program.iPerson.ReturnHello());
} public string RetrunWorld()
{
return "World";
}
}
 public class Person : IPerson
{
IProgram iProgram = new Program();
public Person()
{
Console.WriteLine(iProgram.RetrunWorld());
} public int InfiniteRecursion(int a)
{
int b = a;
return GetResult(b);
} private int GetResult(int a)
{
int result = a + ;
return InfiniteRecursion(result);
}
public string ReturnHello()
{
return "Hello";
} #region 属性
private string _name; public string Name
{
get { return _name; }
set { _name = value; }
} private int _age; public int Age
{
get { return _age; }
set { _age= value; }
} private string _sex; public string Sex
{
get { return _sex; }
set { Sex= value; }
} #endregion
}
interface IProgram
{
string RetrunWorld();
}
interface IPerson
{
string ReturnHello();
}

为什么会抛出该异常(栈溢出的异常)?

一.什么是栈?

首先我们知道在一个进程当中内存主要分为两大区域:栈区和堆区,而每个进程当中又有一个或多个线程而栈区就是存在于每个一个线程当中,且每个线程存在初始化大小为1M,因此我们又把栈称为线程堆栈,或者线程栈,而且线程栈是不受GC(垃圾回收机制)管理的,从溢出两个字就可以说明栈其实是有一个空间大小的,当栈分配的空间不足以存放超过分配空间的大小的数据,就发生了栈溢出的情况下

在这里提一句解释下堆区,堆区是一个进程在初始化的时候会在内存又划出一块区域用来存储某种类型的,而且受GC管理,因此又称为托管堆而且托管堆区在32位系统在一个进程中能最多被分配1.5G的内存空间,在64位能分配8TB内存空间,因此我们很少会遇到堆的溢出,而且GC会在特定的时间释放没用到的堆空间,

首先我们知道栈是内存划分出来为一个区域专门为一个进程存放某种类型的数据,下面大概讲解栈为存放那些类型的数据

1.参数:值参数,引用参数,输出参数

2.局部变量

3.返回数据和返回地址

因此我们终于知道为什么方法的循环调用和属性的Set方法的写错(属性本质也是方法)以及类的循环调用会导致栈溢出异常的产生,因为方法的循环调用没有返回,导致在一个进程当中的栈区域一直被填充,且线程栈其实在一个进程当中是有一定的空间的,直到填充超出了栈顶,因此溢出了

二.怎么快速确定什么原因排查到错误

这时候要请出我们宇宙第一IDE:Visual Studio,在调试的时候通过调用栈堆来观看方法的调用,最顶层则是最新调用的一次方法从下图在调用栈堆清晰可以看到是两个类在初始化的时候互相调用了,调用栈堆和线程栈是一一对应的,当方法调用完后会释放线程栈,则调用栈堆也会少一条信息

文章本着学习的目的,如果文章当中有不正确的地方或者有更好的解释欢迎指点

 
 
 

你了解栈溢出StackOverFloweExeption的原理吗?的更多相关文章

  1. shellcode在栈溢出中的利用与优化

    0x00 前言 在<Windows Shellcode学习笔记——shellcode的提取与测试>中介绍了如何对shellcode作初步优化,动态获取Windows API地址并调用,并通 ...

  2. 用于阻止缓冲区溢出攻击的 Linux 内核参数与 gcc 编译选项

    先来看看基于 Red Hat 与 Fedora 衍生版(例如 CentOS)系统用于阻止栈溢出攻击的内核参数,主要包含两项: kernel.exec-shield 可执行栈保护,字面含义比较“绕”, ...

  3. PC平台逆向破解实验报告

    PC平台逆向破解实验报告 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另 ...

  4. 20145217《信网络对抗》逆向与BOF基础实践

    20145217<信网络对抗>逆向与BOF基础实践 内容: 一.简单机器指令,汇编语言 1.'objdump -d xxx|more'反汇编命令查看机器代码,'cat'显示文件内容,'xx ...

  5. 20155306 白皎 0day漏洞——漏洞利用原理之栈溢出利用

    20155306 白皎 0day漏洞--漏洞利用原理之栈溢出利用 一.系统栈的工作原理 1.1内存的用途 根据不同的操作系统,一个进程可能被分配到不同的内存区域去执行.但是不管什么样的操作系统.什么样 ...

  6. Windows栈溢出原理

    1.栈是什么? 栈是一种运算受限的线性表 其限制是仅允许在表的一端进行插入和删除运算 这一端称为栈顶(TOP),相对的另一端称为栈底(BASE) 向一个栈插入新元素,称作进栈.入栈或压栈(PUSH) ...

  7. 《浏览器工作原理与实践》<08>调用栈:为什么JavaScript代码会出现栈溢出?

    在上篇文章中,我们讲到了,当一段代码被执行时,JavaScript 引擎先会对其进行编译,并创建执行上下文.但是并没有明确说明到底什么样的代码才算符合规范. 那么接下来我们就来明确下,哪些情况下代码才 ...

  8. 逆向工程学习第四天--Windows栈溢出保护机制(GS)原理及绕过测试

    GS简介: Windows的缓冲区安全监测机制(GS)可以有效的阻止经典的BOF攻击,因为GS会在函数调用前往函数栈帧内压入一个随机数(canary),然后等函数返回前,会对canary进行核查,判断 ...

  9. 栈溢出原理与 shellcode 开发

     ESP:该指针永远指向系统栈最上面一个栈帧的栈顶  EBP:该指针永远指向系统栈最上面一个栈帧的底部 01  修改函数返回地址 #include<stdio.h> #include< ...

随机推荐

  1. Prometheus

    官方网址:https://prometheus.io/ GitHub网址:https://github.com/prometheus/prometheus 软件下载地址:https://prometh ...

  2. [Flutter] lib/main.dart:1: Warning: Interpreting this as package URI, 'package:flutter_app/main.dart'.

    lib/main.dart:1: Warning: Interpreting this as package URI, 'package:flutter_app/main.dart'. import ...

  3. AX2009里调用.NET DLL的效率问题

    经常在AX2009里引用.NET的DLL,因为序列化和反序列化,用.NET的定义的实体方便一些,平时数据量不大,也没觉得有什么问题,今天要把几万条数据从数据库中取出来序列化以后,调用第三方系统的接口, ...

  4. django restfulwork 源码剖析

    概要: 1.restful 规范(建议); 2. django rest framework框架 内容回顾: 1.开发模式; - 普通开发模式(前后端放在一起写) - 前后端分离 好处: 后端一套,前 ...

  5. JAVA WEN开发环境与搭建

    一.下载安装JDK1.配置jdk开发环境JAVA_HOME 2.path 二.下载安装eclipse javaEE版本 三.安装部署tomcat3.1.安装: 直接解压到指定目录即可.(注:目录不要太 ...

  6. Robot Return to Origin

    There is a robot starting at position (0, 0), the origin, on a 2D plane. Given a sequence of its mov ...

  7. Node.js的内存问题

    v8堆内存限制默认是1GB,所以可能成为瓶颈. 但是Buffer的内存不受限制,而且可以开多个Nodejs实例然后通过代理进行负载均衡,不过不知道这样效果怎么样呢? 但是基本上应该内存的话不会成为单实 ...

  8. 关于AVL树的思考

    AVL树即平衡二叉树,每个结点有一个平衡因子,即左子树高度减去右子树高.每插入一个结点时,从根部开始按二叉排序树的方法,与节点不断比较,按大小向左右子树插入.在与最后的节点比较后插入时,若有兄弟节点, ...

  9. Centos6安装和配置etcd3

    etcd 是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现.etcd 的灵感来自于 ZooKeeper 和 Doozer,侧重于: 简单:支持 curl 方式的用户 API ( ...

  10. pwnable.kr-input-witeup

    查看代码,有5个stage,一一解决掉就能愉快看到flag了. 第一个stage: 解决方案: 第二个stage: 解决方案: 使用了os.pipe()函数功能,os.pipe()用于创建一个管道,返 ...