【发布时间】:2014-04-17 09:12:16
【问题描述】:
您好,我在 qt 中用 C++ 编写了一个程序,经过几个小时的工作,我的程序突然崩溃了,我不知道为什么。
我很想知道原因,所以我对自己说要使用一个文件并将我的程序日志写入其中。所以如果它崩溃了,我可以看到出了什么问题并修复它。我不想使用控制台。因为它将变成数千行信息,我更喜欢将它们放在文本文件中而不是 qt 控制台中。
我不能对调试文件使用单个打开和关闭,因为如果我的程序突然崩溃,调试文件将没有任何信息,它将变成一个空文本文件,所以我写了这个线程来存储我的程序日志与多个关闭和打开:
QFile *Debug_File;
QTextStream *Debug_File_Interface;
DebugClass::DebugClass(QObject *parent) :
QThread(parent)
{
qDebug()<<"DebugClass Thread is started .... \n";
Debug_File = new QFile("Debug_Details.txt");
Debug_File_Interface = new QTextStream(Debug_File);
Debug_File->open(QIODevice::WriteOnly);
*Debug_File_Interface<<"Starting ..... "<<"\n";
Debug_File->flush();
Debug_File->close();
}
void DebugClass::run()
{
while(1)
{
for( ; Log_VEC.size()>0 ; )
{
Debug_File->open(QIODevice::Append);
*Debug_File_Interface<<Log_VEC[0]<<"\n";
Debug_File->flush();
Debug_File->close();
QMutexLocker Locker(&LOG_VEC_MUTEX);
Log_VEC.erase(Log_VEC.begin());
Locker.unlock();
}
}
}
我在我的 CPP 文件中这样称呼这个线程:
X1.cpp
X1::Function1()
{
//Process1
....
//End Of Process1
QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
Log_VEC.push_back(Process1Log);
Log_Locker.unlock();
//Process2
....
//End Of Process2
QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
Log_VEC.push_back(Process2Log);
Log_Locker.unlock();
}
X1::Function2()
{
//Process3
...
//end of Process3
QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
Log_VEC.push_back(Process3Log);
Log_Locker.unlock();
//Process4
....
//End Of Process4
QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
Log_VEC.push_back(Process4Log);
Log_Locker.unlock();
}
X2.cpp
X2::Function1()
{
//Process1
....
//End Of Process1
QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
Log_VEC.push_back(Process1Log);
Log_Locker.unlock();
//Process2
....
//End Of Process2
QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
Log_VEC.push_back(Process2Log);
Log_Locker.unlock();
}
X2::Function2()
{
//Process3
...
//end of Process3
QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
Log_VEC.push_back(Process3Log);
Log_Locker.unlock();
//Process4
....
//End Of Process4
QMutexLocker Log_Locker(&LOG_VEC_MUTEX);
Log_VEC.push_back(Process4Log);
Log_Locker.unlock();
}
对于其他 cpp 文件也是如此。当我运行我的程序一分钟以查看它是否有效时,我意识到文本文件中只写了一行,这是我在 Thread 类的构造函数中写的那一行!!!
为什么文本文件中没有任何内容?这是一个大项目的一部分,我想通过检查这个日志文件来确保一切顺利。
谢谢
【问题讨论】:
-
虽然日志记录对大型程序有很大帮助,但不要忘记有 valgrind 和静态分析程序 (en.wikipedia.org/wiki/…) 等工具可以帮助防止在某些意外点导致崩溃的错误。