我刚刚写了一些代码来追踪这个问题。我们有一个相当大的代码库(1000+个文件),在Windows/VC++ 2005上运行良好,但在Solaris/gcc上启动时会崩溃。
我编写了以下的.h文件:
#ifndef FIASCO_H
#define FIASCO_H
#define ENABLE_FIASCO_FINDER
#ifdef ENABLE_FIASCO_FINDER
#include <iostream>
#include <fstream>
inline bool WriteFiasco(const std::string& fileName)
{
static int counter = 0;
++counter;
std::ofstream file;
file.open("FiascoFinder.txt", std::ios::out | std::ios::app);
file << "Starting to initialize file - number: [" << counter << "] filename: [" << fileName.c_str() << "]" << std::endl;
file.flush();
file.close();
return true;
}
#define FIASCO_FINDER static const bool g_psuedoUniqueName = WriteFiasco(__FILE__);
#else
#define FIASCO_FINDER
#endif
#endif
在解决方案中的每个.cpp文件内,我添加了以下内容:
#include "PreCompiledHeader.h"
FIASCO_FINDER
#include "RegularIncludeOne.h"
#include "RegularIncludeTwo.h"
当您运行应用程序时,您将获得一个输出文件,如下所示:
Starting to initialize file - number: [1] filename: [p:\\OneFile.cpp]
Starting to initialize file - number: [2] filename: [p:\\SecondFile.cpp]
Starting to initialize file - number: [3] filename: [p:\\ThirdFile.cpp]
如果你遇到了崩溃,罪魁祸首应该在最后一个列出的 .cpp 文件中。至少,这将为您提供一个很好的设置断点的地方,因为此代码应该是在您的代码执行之前(之后您可以逐步执行您的代码并查看正在初始化的所有全局变量)。
注意事项:
- 将 "FIASCO_FINDER" 宏放在文件顶部尽可能靠近的位置非常重要。如果将其放在某些其他 #包含语句下面,则有可能在确定所在文件之前就会崩溃。
- 如果您使用 Visual Studio 和预编译头,则可以使用“查找和替换”对话框将此额外的宏行添加到
所有 的 .cpp 文件中。将现有的 "#包含预编译头文件.h" 替换为相同的文本加上 FIASCO_FINDER 行(如果选中 "正则表达式",则可以使用 "\n" 插入多行替换文本)。