最近用vs2017最新版的时候发现UE4.18和4.19preview会有一个问题,那就是在developmentEditor模式下调试,断点会飘。明明下了断点的地方直接跳过去了。于是去查了一下文档:
在Release模式下,代码会进行优化。所以很多调试符号都没有了。DevelopmentEditor其实还是Release模式。解决这个问题有两个办法,第一个就是手动关闭release模式的优化
加入#pragma optimize("",off)即可。但是你得去手动关闭每个你需要调试的cpp。这样比较麻烦。并且还有一些限制
还有一种方法就是直接切调试模式。但是在4.18和4.19preview模式下切调试模式的时候发现,DebugGameEditor直接编译不过去。原因是源码有bug,错误加载了一个文件。可以简单粗暴把下面一段代码注释掉:
注释掉后在build一下引擎就可以了。
如果不想用这么简单粗暴的办法,那就从根本上解决。因为引擎没有对DebugGame进行判断,那么我们就加一个
在Runtime/Source/Projects/Private/BuildiVersion.cpp中把FString FBuildVersion::GetFileNameForCurrentExecutable()这个函数改一下:
FString FBuildVersion::GetFileNameForCurrentExecutable()
{
FString AppExecutableName = FPlatformProcess::ExecutableName();
#if PLATFORM_WINDOWS
if(AppExecutableName.EndsWith(TEXT("-Cmd")))
{
AppExecutableName = AppExecutableName.Left(AppExecutableName.Len() - 4);
}
#endif
#if IS_PROGRAM || IS_MONOLITHIC
return FPaths::ProjectDir() / TEXT("Binaries") / FPlatformProcess::GetBinariesSubdirectory() / AppExecutableName + TEXT(".version");
#else
FString Section = FPaths::EngineDir() / TEXT("Binaries") / FPlatformProcess::GetBinariesSubdirectory() / AppExecutableName;
if (FApp::GetBuildConfiguration()==EBuildConfigurations::DebugGame)
{
Section += FString::Printf(TEXT("-%s-DebugGame"), FPlatformProcess::GetBinariesSubdirectory());
}
Section+= TEXT(".version");
return Section;
#endif
}
Build一下。完美解决。
更新一下这篇文章:
2017年10月19日的时候,虚幻源码master版,官方已经亲自修复了这个问题了。