C++程序在debug模式下遇到Run-Time Check Failure #0 - The value of ESP was not properly saved across a functio...

2023-11-04

今天遇到一个Access Violation的crash,只看crash call stack没有找到更多的线索,于是在debug模式下又跑了一遍,遇到了如下的一个debug的错误提示框:

runtimecheckfailureESP

这个是什么原因呢?我们来看一个简单的例子来重现这个错误。

假设我们有2个父类,分别是BaseA和BaseB。有一个子类Child,继承自BaseA和BaseB。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class BaseA
{
public:
    virtual void foo()=0;
};

class BaseB
{
public:
    virtual void bar(int a)=0;
};

class Child: public BaseA, public BaseB
{
public:
    void foo()
    {
        cout<<"i'm foo in Child!"<<endl;
    };
    void bar(int a)
    {
        cout<<"i'm bar in Child!"<<endl;
    };
};

 

假设我们有如下的main函数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
int main() {

    BaseB* b = new Child();
    BaseA* a = (BaseA*)b;
    BaseA* a2 = dynamic_cast<BaseA*> (b);
    // This is actually calling bar(),
    // and will cause Runtime check failure about ESP if the foo and bar have different signature.
    a->foo(); 
    a2->foo();
}

 

在这个main函数里a是通过C-Style的强转转来的,a2是通过dynamic_cast转换来的。如果我们运行这个程序,在release下就会报access violation的crash,在debug下就会出上面列的ESP错误的对话框。

函数的输出如下图所示:

espoutput

这就能解释为什么会出这个ESP的错误了,因为我们想调用foo,但是实际上调用的bar,但是foo和bar的函数签名不一样,所以导致了出现那个debug版本下的ESP的错误提示。但是加入我们把bar(int a)中的参数去掉,这样foo和bar就有一样的函数签名了,这样及时在debug版本下也不会出这个ESP的提示,在release或者debug模式下都不会报任何错误,但是我们在runtime调用了错误的函数!!!

可以看看下图回忆一下vtable是怎么回事:)

image

 

也可以参考怎么看C++对象的内存结构 和 怎么解密C++的name mangling - fresky - 博客园来看看C++对象的内存结构。

对于ESP的错误,可以参考stackoverflow上的这个问题:c++ - Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call - Stack Overflow

转载于:https://www.cnblogs.com/fresky/p/3314588.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++程序在debug模式下遇到Run-Time Check Failure #0 - The value of ESP was not properly saved across a functio... 的相关文章

  • jar中的类在运行时未找到,但用于编译

    从 ant 文件构建此项目后 我收到一个包含我构建的所有类的 jar 当我尝试运行这个 jar 时 出现以下错误 Exception in thread main java lang NoClassDefFoundError javax m
  • 从java程序运行jar文件

    我正在尝试从另一个 Java 程序执行 jar 文件 我正在使用以下代码 try Runtime runtime Runtime getRuntime runtime exec path upto jar catch Exception e
  • EF7 在运行时更改连接字符串

    在 EF 的早期版本中 我们能够更改 dbcontext 连接字符串 如下所示 context Database Connection ConnectionString the new connectionstring 我们如何使用 EF7
  • Microsoft Visual C++ 运行时版本?我需要把它们全部保留吗?

    我环顾四周 不确定是否能找到明确的答案 所以如果之前有人问过这个问题 我很抱歉 我的 Google Fu 让我失望了 我们正在针对 NET Framework 开发软件 但从历史上看 我们必须包含许多第三方组件 此外 从历史上看 这些往往与
  • chrome 扩展 - 我如何等待 chrome.runtime 函数?

    我在后台的操作是访问该站点并从那里获取信息 问题是代码在收到信息之前继续运行 附上显示问题的代码 背景 js chrome runtime onMessage addListener function request sender send
  • 如何以编程方式设置或清除 32BIT 标志?

    编译时 我总是将其设置为 Any CPU 然而 有些客户没有所需二进制文件的 64 位版本 即使在 x64 系统上运行也是如此 在这些情况下 我要求他们使用 corflags exe 32BIT 选项修改我的二进制文件 http msdn
  • java中的虚方法调用是什么?

    我在一些计算机科学测试中看到了下一段 我希望我能在这里得到它的含义的一个很好的解释 因为我用谷歌搜索了一个小时 但找不到任何东西 当我们说 Java 语言有虚方法调用我们的意思是 在java应用程序中 执行的方法是由运行时的对象类型决定的
  • Python - 导入函数和本地声明函数之间的性能差异?

    在 Python 中导入函数与在当前文件中声明函数在性能上是否存在显着差异 我有一个小函数 单行 我经常在几个函数中使用它 py我的程序中的文件 我希望只定义一次 以便我对它所做的更改反映在各处 但是 我不确定将它用作导入函数是否会在调用它
  • 无法调试,致命信号 6 (SIGABRT) 位于 0x00007c37(代码=-6)

    我遇到了以下情况 无法调试 Android 应用程序 我可以运行它 但无法调试它 我开始了全新的项目 复制了所有内容并且它有效 意味着能够调试 但又得到了这个 我在模拟器和手机上都尝试过 但没有成功 我使用的是Android Studio
  • 以编程方式添加项目引用

    基本上 在阅读了几个链接后 我尝试了上面的代码 foreach EnvDTE Project proj in soln Projects if proj Name BLL VSLangProj VSProject vsproj VSLang
  • Scala:在运行时替换方法

    假设我有课 class Original def originalMethod 1 现在 假设我有一个例子 val instance new Original 现在是否可以做点什么instance在运行时替换originalMethod用不
  • MS 缺少 VSTO 4.0 运行时下载?

    我们有代码检查 VSTO 4 0 运行时是否存在并下载 如果丢失 直到今天这一切都运作良好 MS 中的 VSTO 运行时文件似乎丢失了 有人对这个有了解吗 我们能否告诉客户这是 MS 问题并且很快就会得到解决 Google 没有找到任何有关
  • 未确定的泛型类型在 ghci 的运行时中如何表示

    我很清楚通用函数和通用数据类型 在泛型类型中 data SB forall x show x gt SB x instance Show SB where show SB x show x 所以对于任何给定类型x 如果它有一个签名Show
  • 在运行时添加路由 (ExpressJs)

    我想在运行时添加路线 我读到这是可能的 但我不太确定如何 目前我使用以下代码 var app express function CreateRoute route app use route require routes customcha
  • 在 Solaris 上,使用 gcc 编译的库与使用 cc 生成的库的使用方式是否相同?

    我目前正在尝试编译 libxml2在 Solaris 上 当我运行源代码提供的 configure 脚本时 会自动使用 gcc 和 g 编译器 但是 我想使用 cc 和 CC 编译器 所以我跑 configure CC cc CXX CC
  • GOMAXPROCS 默认值是多少?

    不设置同名环境变量时是否保证GOMAXPROCS设置为1 此代码显示的值 package main import runtime fmt func getGOMAXPROCS int return runtime GOMAXPROCS 0
  • 哪些属性有助于运行时 .Net 性能?

    我正在寻找可用于通过向加载器 JIT 编译器或 ngen 提供提示来确保 Net 应用程序获得最佳运行时性能的属性 例如我们有可调试属性 http msdn microsoft com en us library k2wxda47 aspx
  • 从 datagridview C# 中检索数字值

    我正在尝试从 datagridview 检索数值 表中的值和变量 weeklyTotal 的数据类型都是整数 我也试图将其转换为整数 我浏览了整个网站是否有类似的问题 但没有一个解决方案有帮助 我收到的错误消息是 当转换为数字时 该值必须小
  • 具有重复符号的 C++ 插件库上的段错误

    我有一个跨平台 C 应用程序 它分为多个共享库 并从插件共享库加载附加功能 插件库应该是自包含的并自行运行 无需了解或依赖于调用应用程序 其中一个插件包含从主应用程序复制的代码 因此包含与引擎中的符号名称重复的符号名称 是的 我知道这通常是
  • 无法在 Eclipse 中运行 SDL 程序,但可以在 Windows 资源管理器中运行

    我已经安装并设置了 SDL 并设法获得了一个要构建的教程示例 教程代码来自http zamma co uk setup sdl2 eclipse windows http zamma co uk setup sdl2 eclipse win

随机推荐

  • 中小企业数字化转型难?为什么不试试“企业级”无代码平台

    首先 让我们思考一下 中小企业为什么要进行数字化转型 随着全球经济的数字化趋势日益明显 中小企业作为经济的重要组成部分 其数字化转型已成为推动经济高质量发展的关键 数字技术可以帮助中小企业提高生产效率 降低成本 提升产品质量和创新能力 从而
  • 基于matlab实现的水果识别系统设计

    水果识别 摘要 本项目针对多种常见水果混合的图像 利用 Matlab 软件 对水果的识别进行研究 根据水果和背景的差别选取阈值 对去噪增强对比度后的图像进行二值化处理 再对图像进行边缘检测 选定连通区域 标记后再对不同种水果的颜色 形状 大
  • 【机器学习】机器学习实验二:支持向量机(详细代码展示)

    文章目录 一 项目地址 二 实验二的详细代码 一 项目地址 https mbd pub o bread ZJWampxx 二 实验二的详细代码 手动调参
  • Mysql递归查询子级(父子级结构)&从子级ID查询所有父级(及扩展知识)

    文章目录 1 建表及插入数据 2 递归查询子级 包括or不包括自己 递归查询子级sql 可能存在的问题 处理这个存在的问题 可借鉴的扩展参考 重要 mysql根据父节点递归查询所有子节点 根据一个父节点查询所有子节点 包含自身 根据多个父节
  • React 项目怎么引入自定义组件、传递参数到组件

    1 首先需要在使用组件的页面引入自定义组件 src index js 是一个入口文件 我们也可以在这里引用 import React Suspense Component from react 引入自定义组件 import ReactDOM
  • Python番外篇:用Pygame制作一场漂亮的流星雨

    hello 大家好 我是wangzirui32 今天我们来学习如何用Pygame制作一场漂亮的流星雨 开始学习吧 文章目录 前言 1 素材图片 2 项目结构 3 编写代码 3 1 Star类 3 2 主项目demo py 4 效果展示 写在
  • 详解linux下的串口通讯开发

    串行口是计算机一种常用的接口 具有连接线少 通讯简单 得到广泛的使用 常用的串口是RS 232 C接口 又称EIA RS 232 C 它是在1970年由美国电子工业协会 EIA 联合贝尔系统 调制解调器厂家及计算机终端生产厂家共同制定的用于
  • 【UE4】纯蓝图实现数据表(DataTable)的写入存储

    前言 UE4可以方便的实现表格的读取 通常是将csv表格文件按对应表头结构体导入后 作为引擎内的DataTable类型文件再进行使用 读取DataTable的操作 可以通过GetDataTableRowNames和GetDataTableR
  • 简单介绍使用图片 base64 编码的优点和缺点。

    base64 编码是一种图片处理格式 通过特定的算法将图片编码成一长串字符串 在页面上 显示的时候 可以用该字符串来代替图片的 url 属性 使用 base64 的优点是 1 减少一个图片的 HTTP 请求 使用 base64 的缺点是 1
  • 采用定时器指令和比较指令控制多台电动机顺序起动、逆序停止

    实验要求 在一些机械的生产过程中 经常需要到要求多台电动机的起动和停止按照一定的顺序进行 例如 要求三台电动机M1 M2 M3在按下起动开关时电动机顺序启动 起动的顺序为M1 M2 M3 顺序起动时时间的间隔为60秒 启动完毕后电动机正常工
  • Python练习之选择与循环

    目录 1 编写程序 运行后用户输入4位整数作为年份 判断其是否为闰年 提示 如果年份能被400整除 则为闰年 如果年份能被4整除但不能被100整除也为闰年 2 编写程序 用户从键盘输入小于 1000 的整数 对其进行因式分解 例如 10 2
  • 你好,语义分割(二)

    在 你好 语义分割 一 中 我们介绍了语义分割的概念 数据的准备过程和模型设计 并且使用数据加载器对数据进行训练集 验证集和测试集的拆分 接下来 我们使用训练集对模型进行训练 用来学习理想的参数 2 3 训练 Train 2 3 1 学习准
  • 2019中科实数杯( Q1内存镜像取证分析、Q4加密磁盘分析)

    文章目录 题目 Q1 内存取证 Q4 加密容器 题目 Q1 内存取证 Q4 加密容器
  • pppoe路由桥混合模式_为什么宽带账号分路由模式和桥接模式?

    我看了下他人的回答都是说的 猫 是怎么回事 宽带连接相关的和这个问题根本不沾边的 都在说光猫设备与宽带账号的设置 根据我所知道的回答一下这个问题 家庭的光猫大部分由路由模式和桥接模式 无线路由器的WAN接口的连接方式由桥接模式 PPPOE拨
  • Spark原理-SparkSql框架优化策略

    有了SparkCore为什么还要有SparkSql呢 有两大原因 一是SparkCore只能用Api 这就把很多SqlBoy拒之门外 Spark就无法发扬光大了 二是使用Api时用户编写的函数作为一个个闭包被序列化后分发到Executor执
  • kubesphere devops使用

    一 创建项目 1 创建项目 企业管理员切换到相应企业空间 租户 创建项目 k8s集群会创建一个相同名字的namespace 如下图所示管理员创建一个ipaas devops项目 2 创建镜像拉取密钥信息 进入项目如ipaas devops
  • elasticsearch7.0 通过api 分页查询产生的问题

    Result window is too large from size must be less than or equal to 10000 but was 44232 See the scroll api for a more eff
  • 用mapreduce来操作hbase的两点优化

    用mapreduce来操作hbase的两点优化 用MR来对hbase的表数据进行分布式计算 有两点配置可以优化操作 提升性能 它们分别是 1 scan setCacheBlocks false 然后调用下面这句来初始化map任务 Table
  • 《数据挖掘基础》习题一

    7 数据 data 信息 information 和知识 knowledge 是人们认识和利用数据的三个不同阶段 数据挖掘技术是如何把它们有机的结合在一起的 数据是形成知识的源泉 不断的利用知识来获得信息 具体表现如下 客观世界 收集 数据
  • C++程序在debug模式下遇到Run-Time Check Failure #0 - The value of ESP was not properly saved across a functio...

    今天遇到一个Access Violation的crash 只看crash call stack没有找到更多的线索 于是在debug模式下又跑了一遍 遇到了如下的一个debug的错误提示框 这个是什么原因呢 我们来看一个简单的例子来重现这个错