今天下午花了很久去调试这个bug,因为自己一个dll函数参数的疏忽,导致浪费很多的时间去调试。
这个参数直接使用了CString类型,后面会造成两次析构而引发ESP出错,直接崩掉...
回来的时候,抽空分析了一下,大致过程是这样的,先写个简单的伪代码来调试吧:
Dll源码:
主工程为对话框,添加两个按钮,消息响应如下:
点击测试,再关闭队话框,即出现常见的对话框(如果在调试时,将会出现上图结果):
Microsoft Visual C++ Debug Library:
Debug Error:
Program: ...
Module:
file: i386/chkesp.c
Line: xx
The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
(Press Retry to Debug the Application)
于是载入IDA,查看两个函数反汇编代码:
于是,这个bug就立刻展现眼前,原来是CString拷贝构造函数引起两次析构函数,而造成ESP出错!于是改这个bug也很简单了,在参数前加个&即可。感谢法师,加一个&符号即可修正之.....
突然,才发现MS SDK的MFC类库函数也很少用到这个类型的参数,只是有很少的一部分也只是加上&引用使用。
所以,建议大家在Dll中尽量不要直接使用CString作为参数,可以直接使用LPCSTR替代吧!
配套源码:http://download.csdn.net/source/2372247
另外,送一个相关的超级传送门...