2011-03-12 117 views
0

我有这个工作来实现提供文件共享功能的库。不会执行的行中的更改会破坏构建!

这已经发生过两次:

首先,在字符串中的if-else路径,只有当正在执行的路径,但是,当我更改其他路径的拼写,软件历经数分钟在std库中崩溃。我通过附带的调试进行了验证,发现内存变化从未被触及。当我扭转变化,它再次很好地工作。其次,我的软件再次在std库上崩溃,out-of-array检查到一个标准的basic_string析构函数中。

我做了一切,所有图书馆都匹配_HAS_ITERATOR_DEBUGGING

4个小时后,我发现有问题的文件是TorrentFile.cpp/h

如果我添加一个函数(即使它从来没有被调用过),程序在该文件的末尾崩溃,但如果它不在那里,就没有错误。导致问题的代码:

std::vector<TorrentFileListPacket> TorrentFile::GetFileMap() 
{ 
    std::vector<TorrentFileListPacket> vFiles; 
    return vFiles; 
}; 

如果我评论此代码,崩溃消失了。

这真的让我疯狂!

我已经做了8年的开发人员,而且我从未见过这样的事情!

其他信息

我的内存是好的,我使用Visual Studio 2010 SP1的Windows 7中的库是从RasterBar libTorrent并将其链接到提高。该软件使用MFC。

+1

由于C++有重载,因此不能假定不会调用新添加的函数。 –

+0

我将函数名设置为GetFileMap101010101010101010101010101并发生同样的崩溃! – bratao

+3

**重建所有** – Erik

回答

6

这种强烈的内存破坏在一个完全不同的位置,从你期望的崩溃位置闻起来。最有可能的添加和删除功能是以这种方式改变内存布局,导致内存损坏的影响立即可见或不可见。

你最好的希望就是像Purify或Valgrind那样追捕它。

+0

我已经有应用程序验证器与所有检测ON(堆等..)。将尝试Devparter(因为Purify不会与VS2010一起使用)。感谢TIP – bratao

1

您可能想要确保所有的目标文件和库都与ABI兼容。

众多的编译器设置将改变ABI。尤其是调试和发布构建和迭代器调试。标准容器的结构布局通常会在您启用迭代器调试时发生变化(我相信默认情况下,msvc中的所有调试版本都处于默认状态,对于发布版本,此布局不变)。

因此,如果您链​​接的单个目标文件,静态库或DLL使用不兼容的配置构建,通常会看到非常奇怪的行为。使用libtorrent时,您需要确保使用与链接相同的配置构建库。许多TORRENT_ *定义实际上会改变某些结构布局或函数调用的某些方面。确保在构建库时,在客户端中定义完全相同的一组。处理这个问题的一个简单方法是简单地将所有源文件拖入您的项目并将所有内容一起构建。

0

如果你正在使用libtorrent作为一个DLL(或为此提升),它们是否针对相同的C运行时进行编译?

通常当我遇到这种类型的问题时,这是因为我调用了一个使用MinGW(使用VS6.0的CRT)或较早版本的Visual Studio编译的库。如果内存由库分配,然后由应用程序释放,则通常会在析构函数中获得这些类型的错误。

如果您不确定,可以使用Dependency Walker这样的工具打开有问题的DLL。查找相关性MSVCRT.DLL,MSVCR100.DLL等。