__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 引起的程序崩溃,布布扣,bubuko.com

时间: 2024-10-15 16:47:50

__stdcall __cdecl 引起的程序崩溃的相关文章

__stdcall,__cdecl,__fastcall的区别

__stdcall,__cdecl,__fastcall的区别 标签: dll编译器pascalclassimportinitialization 2009-12-09 15:07 10472人阅读 评论(1) 收藏 举报 分类: C/C++(22) __stdcall,__cdecl,__fastcall的区别 一.三者区别一览表 __stdcall __cdecl __fastcall 参数传递方式 右->左 压栈 右->左 压栈 左边开始的两个不大于4字节(DWORD)的参数分别放在EC

QSqlQuery 可以让你的程序崩溃

linux平台下. 一个程序总是运行个两三天,或者一两天的时候突然崩溃了,以前发过一个讨论但是也没找到解决办法,使用的数据库是SQLITE 使用GDB跟踪程序,结果找到了崩溃的地方却显示栈被破坏显示不出调用的具体方法,运行了好几次都是这样.定位到了 __memmove_ssse3在libc里面. 为了恢复完整的栈信息在国外大牛那里找来两句话 (gdb)set $pc=*(void **)$esp (gdb)set $esp=$esp+4 执行完就可以查看堆栈了(32位平台).注意这个不能由cor

升级iOS10之后调用摄像头/麦克风等硬件程序崩溃闪退的问题

在升级到iOS10之后, 开发过程中难免会遇到很多的坑, 下面是一些常见的坑, 我做了一些整理, 希望对大家开发有帮助: &1. 调用视频,摄像头, 麦克风,等硬件程序崩溃闪退的问题: 要注意的问题 iOS10 对隐私权限的管理更为严格 ,比如访问的摄像头.麦克风等硬件,都需要提前请求应用权限.允许后才可以使用,或者现在要提前声明,虽然以往要求不严格. 在iOS10中比如遇到崩溃,日志: *This app has crashed because it attempted to access p

未捕获异常,现实程序崩溃闪退

碰到程序崩溃时,闪退效果,不会提示"xxx程序异常,退出程序".这样的效果就要使用到未捕获异常来实现,这里记录了我的一个写法.其实原理很简单,设置程序的未捕获异常监听,实现监听的一个方法,在该方法中现实直接没有提示的退出程序. 捕获异常工具类 package com.tdh.http; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.Thread.UncaughtExceptionHan

WinCE应用程序崩溃提示框的处理

WinCE的开发人员和WinCE设备的用户应该对下面这两个错误不陌生,"Application encountered a serious error and must shut down"和"出现严重错误,必须被关闭".WinCE下应用程序崩溃就会弹出这样的提示框,还会发出警告的声音.如果是在车里,那声音还是很刺耳的.不过,说实在的,开发人员看到这个可以接受,程序都是会出BUG的.但用户经常看到就不太应该了.我们应该完善代码,尽可能降低出现应用程序崩溃的概率. 很

Linux 使用core file文件快速定位程序崩溃代码行

问题描述 如果在 Linux下编写程序,有时运行程序的时候程序崩溃,比如说只有"Segmentation fault (core dumped) ",程序比较小的话,还可以一行一行查看,但是如果程序很庞大,一行行查询,效率非常低下.Linux下可以程序可以生成core file文件,借助gdb很快能定位到崩溃的代码行. 解决方案 测试程序,除零操作,程序会崩溃 /* test.c */ #include <stdio.h> #include <stdlib.h>

【转】程序崩溃时自动记录minidump的c++类

原帖:程序崩溃时自动记录minidump的c++类 封装了一个C++类,当程序意外崩溃的时候可以生成dump文件,以便确定错误原因. 头文件: //crash_dumper_w32.h #ifndef _CRASH_DUMPER_H_ #define _CRASH_DUMPER_H_ #include <windows.h> class CrashDumper { public: CrashDumper(); ~CrashDumper(); static bool _PlaceHolder()

dll的内存申请和释放问题--Debug程序正常而Release程序崩溃

C++编程中经常遇到这样的需求:主函数需要调用一个功能函数并返回一块大小不定的存储着处理结果的内存,这时容易想到两种选择:一是使用vector类型的引用作为形参,无需考虑内存问题:二是使用指针,在主函数中定义指针,而在功能函数中申请内存.这两种处理方法本来没有问题,但如果功能函数是dll中的函数,那么就需要十分小心了. 下面我们直接上结论: 1. 如果使用vector类型作为dll库函数的形参,那么一定不能在库函数中更改vector的大小,而只能更改vector的内容: 2. 如果使用指针,且在

结合程序崩溃后的core文件分析bug

结合程序崩溃后的core文件分析bug 引言 在<I/O的效率比较>中,我们在修改图1程序的BUF_SIZE为8388608时,运行程序出现崩溃,如下图1: 图1. 段错误 一般而言,导致程序段错误的原因如下: 内存访问出错,这类问题的典型代表就是数组越界. 非法内存访问,出现这类问题主要是程序试图访问内核段内存而产生的错误. 栈溢出, Linux默认给一个进程分配的栈空间大小为8M,因此你的数组开得过大的话会出现这种问题. 首先我们先看一下系统默认分配的资源: $ ulimit -acore