__stdcall __cdecl 引起的程序崩溃
崩溃弹出的截图如下
看到0xC0000005, 访问冲突的问题, 九成九是内存访问违规, 比如访问了已经释放的指针, 又或者是离开函数时栈被破坏之类.
找了一下午一直没有头绪, 好在有一份可以执行的源代码, 于是就将那份可执行的源代码改啊改, 改成和我的代码差不多的样子, 终于发现了问题 (我想, 这也算是查找问题的一种方式吧, 呵呵)
问题就出在了我使用的函数是__cdecl方式调用, 而要求传入的回调函数是要__stdcall调用, 结果出回调函数的时候就弹出了上面的那种对话框. 把自己写的函数前面加一个__stdcall 问题就解决了.
温习一下__stdcall, __cdecl这两种调用方式的不同, 从而就可以分析出为什么会崩溃了.
windows要求你给的那个回调函数是__stdcall这种调用方式, 即, 由函数自己来清理函数栈;
而我传入的函数是__cdecl这种调用方式, 这种调用方式是要调用者来清理它调用的函数的栈, 从而就出现了问题: windows系统调用了我给的函数, 它以为我的这个函数在离开后已经把栈给清空了, 谁知道没有, 但同时我的这个函数已经执行结束了, 但是它的栈中数据没有清空, 就是指针没有指到栈底, 还指在函数栈的某一个地方, 于是, 程序继续往下执行时, 就出现了上面的那个对话框.
关于__stdcall, __cdecl两种调用方式的不同, 参考这篇文章:http://blog.csdn.net/dengziliang001/article/details/17448789
同时他还讲解了, 为什么存在两种方式? {因为有的函数不知道自己有多少参数, 所以要调用者来清理函数栈.} 他还有一个建议: 如果函数参数都固定的话, 应该使用__stdcall调用方式, 因为这种调用方式可以跨平台.
__stdcall __cdecl 引起的程序崩溃相关推荐
- windows程序崩溃调试终极武器
windows程序崩溃调试终极武器---dump文件 一.前言 前不久开发了一款windows程序,目前已经是测试跑了,对于windows程序熟悉的童鞋,应该都知道一个事,就是他运行时有一个黑框,如果 ...
- c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题
代码 总结下c语言中字符串数组的地址存放问题 #include <iostream> using namespace std; #include<bits/stdc++.h>i ...
- Linux下程序崩溃dump时的 core文件的使用方法
Linux下程序崩溃dump时的 core文件的使用方法 1.在启动程序前执行 ulimit -c unlimited unlimited 表示生成文件的大小限制,也可以修改为自定义的大小,例如: u ...
- 【Qt】Qt信号与槽使用不当,使程序崩溃
问题描述 跨线程使用Qt信号和槽,信号发送时间间隔小于槽函数处理时间时,造成程序崩溃. 原因分析 跨线程使用Qt信号和槽时,connect默认是QueuedConnection,队列连接方式. 信号传 ...
- Go程序崩溃现场应该如何保留?
Go 程序突然莫名崩溃后,当日志记录没有覆盖到错误场景时,还有别的方法排查吗? 没有消灭一切的银弹,也没有可以保证永不出错的程序.我们应当如何捕捉 Go 程序错误?我想同学们的第一反应是:打日志. 但 ...
- android查找邮件程序,Android 程序崩溃日志邮件获取
版权声明:本文为博主原创文章,未经博主允许不得转载. 在我们开发Android应用程序的时候,BUG的出现是难以避免的,时不时还会出现崩溃的情况,这个时候,我们急需知道造成问题的原因是什么,但是,在没 ...
- C++程序崩溃生成dump
程序在运行时,难免会有一些异常情况发生,特别是在条件不容许去挂调试器的时候,如何快速的定位错误的方法就显得很重要. 日志一直都是一种很重要的定位错误的方法,出得好的日志可以方便程序员快速的定位问题所在 ...
- iOS 中捕获程序崩溃日志
iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者,是大多数软件都选择的方法.下面就介绍如何在iOS中实现: 1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时 ...
- Windows 7 应用程序崩溃恢复
从Vista 到Windows 7 这两款操作系统都带有应用程序恢复和重启(ARR)功能,利用这个特性可以在应用程序处于无响应甚至崩溃状态时,保存当前正在处理的数据,并将应用程序以及之前的数据恢复.本 ...
最新文章
- (转)命令行下,用 xcodebuild 生成ipa文件,通过 itms-services 协议安装
- 这个安全平台结合Spring Security逆天了,我准备研究一下
- 第二章 数组名是一个指针常量吗?
- 解决Win10不能访问共享文件夹的问题
- mysql 随机查询数据
- 扫描二维码读取文档_使用深度学习读取和分类扫描的文档
- android 环绕布局,Android自定义View实现圆形环绕效果
- Grafana : 前端页面 通过API Key免登录访问Grafana
- HDU 3861 The King’s Problem (强连通缩点+DAG最小路径覆盖)
- Linux的进程/线程/协程系列4:进程知识深入总结:上篇
- 中国临床数据分析市场趋势报告、技术动态创新及市场预测
- Angular企业级开发(3)-Angular MVC实现
- WORD 同一位置连续引用多个参考文献编辑技巧
- 【Python入门练手小项目】画一个蓝胖子❤️
- #9733;双十一背后的消费心理
- Virtex6 PCIe 超简版基础概念学习(二)(转载)
- IDEA项目can not reconnect错误
- 工件SSM:war exploded: 部署工件时出错。请参阅服务器日志了解详细信息
- 【六更完结!由于字数限制开新文章继续】零基础信号与系统学习笔记:复指数信号、傅里叶级数的系数推导、三角函数正交性、离散傅里叶变换、相位补偿、z变换表、逆变换表、常见序列及其作用
- Kali Linux渗透测试——WEB渗透(一)
热门文章
- poj2955 Brackets (区间dp)
- hibernate联合主键 注解方式
- 2的次幂表示【递归算法训练】
- 利用路由器端口映射远程连接
- 在FIREBUG控制台中输入 jQuery() 返回 []
- pip install scrapy安装scrapy库出现error: Microsoft Visual C++ 14.0 is required.问题解决
- Notepad++便签模式
- Log4j2进阶使用(Pattern Layout详细设置)
- c++ class struct同名_如何把C++的源代码改写成C代码?而C改C++只需一步!
- JS:正则表达式详细语法基础