问题遇到的现象和发生背景
使用VS2013社会版能正常仿真调试过这段代码,但换到VS2013旗舰版或VS2022就无法仿真调试过这段代码,一到这段代码程序就运行不下去。
问题相关代码,请勿粘贴截图
一、头文件1 GDATA.h
class GData //供全局使用的数据:Global Data //该类在头文件GDATA.h里
{
public:
GData();
~GData();
friend class singleton<GData>;
void init(void);
bool getExitFlag(void);
void setExitFlag(bool exitFlag);
Ini_Data* pIniData;
};
二、头文件二 singletonl.h
template <class T> //该类在头文件singletonl.h里
class singleton
{
public:
static T& instance()
{
static T _instance;
return _instance;
}
};
三、正式代码里
GData *pGData = &(singleton<GData>::instance());//这行代码仿真调试不过
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
希望知道这段代码为什么在VS2013社会版这段代码能仿真调试,而在旗舰版无法仿真调试
报错信息发出来,总不能让大家猜吧
1.问题描述:无法找到xxx.exe的调试信息,或者调试信息不匹配。未使用调试信息生成二进制文件
解决方法:属性->链接器->调试->生成调试信息:是
2.问题描述:设置断点但无法调试
解决方法:属性->C/C++->常规->调试信息格式:设置为程序数据库
3.问题描述:主程序可以调试,调用的dll模块不能调试,提示“当前不会命中断点还没有为该文档加载符号”
解决方法:每个模块都是设置问题2中的调试信息格式
4.问题描述:调试时变量内容看不到,显示无法读取内存或未定义标识符
解决方法:每个项目都要做这样的处理,右键工程->属性->C/C++->优化->“已禁用/Od”
vs的兼容是永远的痛,看下报错代码,估计那个函数改了吧
VS版本升级后实施了强制安全检查,你的代码有错误,被检查出来了。类singleton的instance函数返回的是局部变量,在该函数退出的时候已经不可使用返回的变量了。理论上该变量在函数返回的时候就会被释放,但因为定义为static,所以没有释放内存,只是依然不允许再被访问,安全检查不严格时,你的程序只是因为内存地址问题凑巧运行了,不代表你的代码正确。
仔细跟踪了下,应该是执行这行代码后,执行调用mysql的数据库DLL时失败了,所以一直卡在
```c++
DBConnect* pDBConn = DBConnPool::Instanse()->GetAConnection();
``
这里,为什么都是2013,同样工程,社会版仿真没问题,旗舰版反而不行