feecb7d4be
This make the system trace check for repeating lines, and only print a "(last message repeated n lines.)" instead of the real message multiple times. This keeps the trace much shorter if messages are repeated. The drawback is that the replacement count message will only get printed on the next line getting traced, so until that happens it swallows the repeated lines. Before saving the systrace buffer is flushed, so this should not raise a problem. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25878 a1c6a512-1295-4272-9138-f99709370657
124 lines
3.8 KiB
C++
124 lines
3.8 KiB
C++
/***************************************************************************
|
|
* __________ __ ___.
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
* \/ \/ \/ \/ \/
|
|
*
|
|
* Copyright (C) 2007 by Dominik Riebeling
|
|
* $Id$
|
|
*
|
|
* All files in this archive are subject to the GNU General Public License.
|
|
* See the file COPYING in the source tree root for full license agreement.
|
|
*
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#include <QtGui>
|
|
#include "systrace.h"
|
|
#include "ui_systracefrm.h"
|
|
|
|
#include "rbsettings.h"
|
|
|
|
QString SysTrace::debugbuffer;
|
|
QString SysTrace::lastmessage;
|
|
unsigned int SysTrace::repeat = 0;
|
|
|
|
SysTrace::SysTrace(QWidget *parent) : QDialog(parent)
|
|
{
|
|
ui.setupUi(this);
|
|
ui.textTrace->setReadOnly(true);
|
|
ui.textTrace->setLayoutDirection(Qt::LeftToRight);
|
|
refresh();
|
|
|
|
connect(ui.buttonClose, SIGNAL(clicked()), this, SLOT(close()));
|
|
connect(ui.buttonSave, SIGNAL(clicked()), this, SLOT(saveCurrentTrace()));
|
|
connect(ui.buttonSavePrevious, SIGNAL(clicked()), this, SLOT(savePreviousTrace()));
|
|
connect(ui.buttonRefresh, SIGNAL(clicked()), this, SLOT(refresh()));
|
|
}
|
|
|
|
void SysTrace::refresh(void)
|
|
{
|
|
int pos = ui.textTrace->verticalScrollBar()->value();
|
|
flush();
|
|
ui.textTrace->setHtml("<pre>" + debugbuffer + "</pre>");
|
|
ui.textTrace->verticalScrollBar()->setValue(pos);
|
|
QString oldlog = RbSettings::value(RbSettings::CachePath).toString()
|
|
+ "/rbutil-trace.log";
|
|
ui.buttonSavePrevious->setEnabled(QFileInfo(oldlog).isFile());
|
|
}
|
|
|
|
|
|
void SysTrace::save(QString filename)
|
|
{
|
|
if(filename.isEmpty())
|
|
filename = RbSettings::value(RbSettings::CachePath).toString()
|
|
+ "/rbutil-trace.log";
|
|
// make sure any repeat detection is flushed
|
|
flush();
|
|
// append save date to the trace. Append it directly instead of using
|
|
// qDebug() as the handler might have been unregistered.
|
|
debugbuffer.append("[SysTrace] saving trace at ");
|
|
debugbuffer.append(QDateTime::currentDateTime().toString(Qt::ISODate));
|
|
debugbuffer.append("\n");
|
|
QFile fh(filename);
|
|
if(!fh.open(QIODevice::WriteOnly))
|
|
return;
|
|
fh.write(debugbuffer.toUtf8(), debugbuffer.size());
|
|
fh.close();
|
|
}
|
|
|
|
void SysTrace::saveCurrentTrace(void)
|
|
{
|
|
QString fp = QFileDialog::getSaveFileName(this, tr("Save system trace log"),
|
|
QDir::homePath(), "*.log");
|
|
if(!fp.isEmpty())
|
|
save(fp);
|
|
}
|
|
|
|
|
|
void SysTrace::savePreviousTrace(void)
|
|
{
|
|
QString fp = QFileDialog::getSaveFileName(this, tr("Save system trace log"),
|
|
QDir::homePath(), "*.log");
|
|
if(fp.isEmpty())
|
|
return;
|
|
|
|
QString oldlog = RbSettings::value(RbSettings::CachePath).toString()
|
|
+ "/rbutil-trace.log";
|
|
QFile::copy(oldlog, fp);
|
|
return;
|
|
}
|
|
|
|
void SysTrace::debug(QtMsgType type, const char* msg)
|
|
{
|
|
(void)type;
|
|
if(lastmessage != msg) {
|
|
lastmessage = msg;
|
|
flush();
|
|
debugbuffer.append(msg);
|
|
debugbuffer.append("\n");
|
|
#if !defined(NODEBUG)
|
|
fprintf(stderr, "%s\n", msg);
|
|
#endif
|
|
repeat = 1;
|
|
}
|
|
else {
|
|
repeat++;
|
|
}
|
|
}
|
|
|
|
void SysTrace::flush(void)
|
|
{
|
|
if(repeat > 1) {
|
|
debugbuffer.append(
|
|
QString(" (Last message repeasted %1 times.)\n").arg(repeat));
|
|
#if !defined(NODEBUG)
|
|
fprintf(stderr, " (Last message repeated %i times.)\n", repeat);
|
|
#endif
|
|
}
|
|
}
|
|
|