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. Dashboard安装配置

    获取dashboard yaml文件 curl -O https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/ ...

  2. vue-router传递参数的几种方式

    参考资料:vue.js官网  博客 vue-router传递参数分为两大类 编程式的导航 router.push声明式的导航 <router-link>编程式导航传递参数有两种类型:字符串 ...

  3. 爬虫之Selenium 动态渲染页面爬取

    Selenim 是一个自动化测试工具,可以利用它驱动浏览器执行特定的动作,如点击.下拉等操作,同时可以获取浏览器当前呈现的页面的源代码,做到可见及可爬 1.使用流程 1)声明浏览器对象 Seleniu ...

  4. Java 定时任务的几种实现方式

    JAVA实现定时任务的几种方式 @(JAVA)[spring|quartz|定时器]  近期项目开发中需要动态的添加定时任务,比如在某个活动结束时,自动生成获奖名单,导出excel等,此类任务由于活动 ...

  5. Django 日志输出及打印--logging

    Django使用python自带的logging作为日志打印工具. logging是线程安全的,主要分为4部分: Logger 用户使用的直接接口,将日志传递给Handler Handler 控制日志 ...

  6. cdnbest常见问题

    1.cdn配置了ssl证书,经常有用户说访问不了,如果cdn配置了ssl,源没有配置ssl,在cdn里添加源ip的写法: 如果源也配置了ssl证书,写法如下图: 2. cdn报504问题的原因: 50 ...

  7. python测试开发django-1.开始hello world!

    前言 当你想走上测试开发之路,用python开发出一个web页面的时候,需要找一个支持python语言的web框架.django框架有丰富的文档和学习资料,也是非常成熟的web开发框架,想学pytho ...

  8. DDB---查询与优化

    摘要:分布式数据库(Distributed DB)是数据库中非常重要的一个部分,随着要处理的数据越来越多,分布式逐渐成为了一种策略.主要有:分布式操作系统,分布式程序设计语言,分布式文件系统,分布式数 ...

  9. redis-dump安装与导出redis数据

    一.安装redis-dump redis-dump安装的时候一般都会遇到下面的错误: ERROR: Error installing redis-dump:redis requires Ruby ve ...

  10. odoo qweb 记录

    默认的打印功能修改,比如在动作中的打印功能: 继承抽象模型 models.AbstractModel 重写 _get_report_values class PayslipDetailsReportI ...