C++程序在debug模式下遇到Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call问题。
今天遇到一个Access Violation的crash,只看crash call stack没有找到更多的线索,于是在debug模式下又跑了一遍,遇到了如下的一个debug的错误提示框:
这个是什么原因呢?我们来看一个简单的例子来重现这个错误。
假设我们有2个父类,分别是BaseA和BaseB。有一个子类Child,继承自BaseA和BaseB。
1 |
class BaseA |
假设我们有如下的main函数:
1 |
int main() { BaseB* b = new Child(); |
在这个main函数里a是通过C-Style的强转转来的,a2是通过dynamic_cast转换来的。如果我们运行这个程序,在release下就会报access violation的crash,在debug下就会出上面列的ESP错误的对话框。
函数的输出如下图所示:
这就能解释为什么会出这个ESP的错误了,因为我们想调用foo,但是实际上调用的bar,但是foo和bar的函数签名不一样,所以导致了出现那个debug版本下的ESP的错误提示。但是加入我们把bar(int a)中的参数去掉,这样foo和bar就有一样的函数签名了,这样及时在debug版本下也不会出这个ESP的提示,在release或者debug模式下都不会报任何错误,但是我们在runtime调用了错误的函数!!!
可以看看下图回忆一下vtable是怎么回事:)
也可以参考怎么看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
C++程序在debug模式下遇到Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call问题。的更多相关文章
- VS2015创建的C++程序在Debug模式下不能调试
如题,不能调试的问题,解决办法: 1.修改工程属性页 2.修改VS2015托管兼容模式 工具->选项->调试,勾选使用托管兼容
- 引入 Tinker 之后如何在 Debug 模式下开启 Instant Run
在<Tinker + Bugly + Jenkins 爬坑之路>一文中讲了在接入 Tinker 之后,Jenkins 中的一些坑,由此,热修复算告一段落,但是,在直接 Run 模式运行时, ...
- Debug模式下加载文件,运行程序异常的慢
今天在进行单元测试的时候,debug模式下加载速度很慢,但是run模式下速度很快. 原因:在debug模式下,断点位置不当,解决办法 移除编译器中的所有断点.
- Myeclipse在debug模式下没加断点程序卡住,start模式下可以正常启动
参考<eclipse在debug模式下卡住,start模式下可以启动>,地址:https://blog.csdn.net/jack_chen1994/article/details/761 ...
- Intellij IDEA debug模式下项目启动慢/无法启动的事件解决过程记录
项目无法启动了 简单的介绍一下事件过程:周一的早上,收到前端同事抛过来的一个任务,说是一个接口无法正常返回数据,于是就让他把参数发过来,我想试着在本地重现一下并且将问题修复掉,这种情况肯定是要通过de ...
- Debug模式下编译溢出问题
问题: 代码在Debug模式下编译报出内存溢出的错误,而Release模式下则没有. 由于Debug模式下包含调试信息,并且不作任何优化.而Release模式进行了各种优化,内存检测等操作均省去,使得 ...
- Debug模式下,测试app后缀名“-测试”
target-->buildsetting-->user-defined 新建一个和上图尖括号一样的字符 如下图: 在debug中填入后缀名,然后在debug模式下运行程序,会发现debu ...
- 在debug模式下引入一些性能检测工具
我们经常在debug模式下使用一些性能检测工具,例如blockCannary,leakCannary.Stetho等,但是我们release的时候又不需要这些检测工具,通常情况下我们的做法是在buil ...
- IDEA Debug模式下启动慢的解决办法
工程没有做什么大的改动,近期Idea在debug模式下启动耗时800s +,run模式下200s.Idea debug模式启动的时候会有这样的提示: 方法断点会戏剧性的降低debug的速度.当时并没有 ...
随机推荐
- URL 路由访问报错
错误: 错误分析: 控制器的文件名命名有问题(index.php) 在TP中控制器命名规范(IndexController.class.php) 相信许多PHP开发者在使用ThinkPHP ...
- JavaScript 实现触点式弹出菜单插件
之前做项目时经常用到一种触点式弹出菜单或者导航的功能,这个功能的主要应用场景是:web页面中多层分级导航或者子功能目录,但又考虑到页面区域有限,于是就考虑到在鼠标移动到某导航按钮上或者点击时,系统将在 ...
- 开发语言大PK:php和Java哪个更好?
Java通过jdbc来访问数据库,通过不同的数据库厂商提供的数据库驱动方便地访问数据库.访问数据库的接口比较统一. PHP对于不同的数据库采用不同的数据库访问接口,所以数据库访问代码的通用性不强.例如 ...
- iOS: 神奇的addSubView
看着addSubView, 本以为是添加多个对象, 但通过测试代码, 发现同一个对象在addSubView中只会添加一次. 想想, 视图对象是通过引用得到的. 在视图的子视图集中, 只保存一个相应的对 ...
- JNI-Test
//testdll.h/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header fo ...
- Xcode中报错或警告信息整理,持续更新...
整理报错和警告信息,为以后自己查看方便用! [报错1] 信息:Static table views are only valid when embedded in UITableViewContro ...
- 使用spm build 批量打包压缩seajs 代码
一,安装环境 1.安装spm spm工具是基于node(nodejs的服务平台)的,因此我们需要先安装 node 和 npm 下载地址:http://nodejs.org/#download.下载完成 ...
- Astyle:代码格式化工具简明指南
astyle是一个我自己常用的开放源码工具.它可以方便的将程序代码格式化成自己想要的样式而不必人工修改.本来嘛,作为高等生物应该优先去做一些智慧的事情,而不是把时间消耗在机器可以完美完成的事情上. 想 ...
- Qt中连接到同一signal的多个slots的执行顺序问题(4.6以后按连接顺序执行)
起源 前些天忘记在哪儿讨论过这个问题,今天在csdn又看到有网友问这个问题,而其他网友却无一例外的给出了“无序”这个答案. Manual Qt的问题,当manual中有明确文字说明时,我们应该以Qt的 ...
- [LeetCode#187]Repeated DNA Sequences
Problem: All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: ...