Author: janderwald
Date: Tue Oct 24 15:21:17 2006
New Revision: 24641
URL:
http://svn.reactos.org/svn/reactos?rev=24641&view=rev
Log:
- fix typo in config file
- implement ROSBOOT_CRITICAL_APP
- implement a class which is responsible for file reading
-
Added:
trunk/reactos/tools/sysreg/file_reader.cpp
trunk/reactos/tools/sysreg/file_reader.h
trunk/reactos/tools/sysreg/user_types.h
Modified:
trunk/reactos/tools/sysreg/conf_parser.cpp
trunk/reactos/tools/sysreg/conf_parser.h
trunk/reactos/tools/sysreg/pipe_reader.h
trunk/reactos/tools/sysreg/rosboot_test.cpp
trunk/reactos/tools/sysreg/rosboot_test.h
trunk/reactos/tools/sysreg/sample.cfg
Modified: trunk/reactos/tools/sysreg/conf_parser.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/conf_parser.c…
==============================================================================
--- trunk/reactos/tools/sysreg/conf_parser.cpp (original)
+++ trunk/reactos/tools/sysreg/conf_parser.cpp Tue Oct 24 15:21:17 2006
@@ -65,7 +65,7 @@
buf = _fgetts(buffer, sizeof(buffer) / sizeof(TCHAR), file);
if (buf)
{
- if (buffer[0] != ';')
+ if (buffer[0] != _T(';'))
{
string s_buffer = string(buffer);
string::size_type ws_pos = s_buffer.find_first_of (_T("="));
Modified: trunk/reactos/tools/sysreg/conf_parser.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/conf_parser.h…
==============================================================================
--- trunk/reactos/tools/sysreg/conf_parser.h (original)
+++ trunk/reactos/tools/sysreg/conf_parser.h Tue Oct 24 15:21:17 2006
@@ -10,7 +10,7 @@
* PROGRAMMERS: Johannes Anderwald (johannes.anderwald at sbox tugraz at)
*/
-
+#include "user_types.h"
#include <string>
#include <map>
#include <tchar.h>
Added: trunk/reactos/tools/sysreg/file_reader.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/file_reader.c…
==============================================================================
--- trunk/reactos/tools/sysreg/file_reader.cpp (added)
+++ trunk/reactos/tools/sysreg/file_reader.cpp Tue Oct 24 15:21:17 2006
@@ -1,0 +1,168 @@
+/* $Id: pipe_reader.cpp 24589 2006-10-21 08:34:00Z janderwald $
+ *
+ * PROJECT: System regression tool for ReactOS
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: tools/sysreg/conf_parser.h
+ * PURPOSE: file reading support
+ * PROGRAMMERS: Johannes Anderwald (johannes.anderwald at sbox tugraz at)
+ */
+
+#include "file_reader.h"
+#include <assert.h>
+
+namespace System_
+{
+//---------------------------------------------------------------------------------------
+ FileReader::FileReader() : m_File(NULL)
+ {
+ }
+//---------------------------------------------------------------------------------------
+ FileReader::~FileReader()
+ {
+ }
+//---------------------------------------------------------------------------------------
+ bool FileReader::openFile(TCHAR const * filename)
+ {
+#ifdef UNICODE
+ m_File = _tfopen(filename, _T("rb,ccs=UNICODE"));
+#else
+ m_File = _tfopen(filename, _T("rb"));
+#endif
+
+ if (m_File)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+//---------------------------------------------------------------------------------------
+ bool FileReader::closeFile()
+ {
+ if (!m_File)
+ {
+ return false;
+ }
+
+ if (!fclose(m_File))
+ {
+ m_File = NULL;
+ return true;
+ }
+
+ return false;
+ }
+//---------------------------------------------------------------------------------------
+ bool FileReader::readFile(vector<string> & lines)
+ {
+ if (!m_File)
+ {
+ return false;
+ }
+
+ bool ret = true;
+ size_t total_length = 0;
+ size_t line_count = lines.size();
+ size_t num = 0;
+ char szBuffer[256];
+ int readoffset = 0;
+
+#ifdef UNICODE
+ wchar_t wbuf[512];
+ int wbuf_offset = 0;
+
+ if (m_BufferedLines.length ())
+ {
+ wcscpy(wbuf, m_BufferedLines.c_str ());
+ wbuf_offset = m_BufferedLines.length ();
+ }
+#else
+ if (m_BufferedLines.length())
+ {
+ strcpy(szBuffer, m_BufferedLines.c_str());
+ readoffset = m_BufferedLines.length();
+ }
+#endif
+
+ do
+ {
+ if (total_length < num)
+ {
+#ifdef UNICODE
+ memmove(wbuf, &wbuf[total_length], (num - total_length) * sizeof(wchar_t));
+ wbuf_offset = num - total_length;
+#else
+ memmove(szBuffer, &szBuffer[total_length], num - total_length);
+ readoffset = num - total_length;
+#endif
+ }
+
+ num = fread(&szBuffer[readoffset],
+ sizeof(char), sizeof(szBuffer)/sizeof(char) - (readoffset+1) * sizeof(char),
+ m_File);
+
+ szBuffer[num] = L'\0';
+
+ if (!num)
+ {
+ if (line_count == lines.size ())
+ {
+ ret = false;
+ }
+ break;
+ }
+ TCHAR * ptr;
+#ifdef UNICODE
+ int i = 0;
+ int conv;
+ while((conv = mbtowc(&wbuf[wbuf_offset+i], &szBuffer[i], num)))
+ {
+ i += conv;
+ if (i == num)
+ break;
+
+ assert(wbuf_offset + i < 512);
+ }
+ wbuf[wbuf_offset + num] = L'\0';
+
+ TCHAR * offset = wbuf;
+#else
+
+ TCHAR * offset = szBuffer;
+#endif
+ total_length = 0;
+ while(ptr = _tcsstr(offset, _T("\x0D\x0A")))
+ {
+ int length = ((unsigned)ptr - (unsigned)offset);
+ length /= sizeof(TCHAR);
+
+ offset[length] = L'\0';
+
+ string line = offset;
+ lines.push_back (line);
+
+ offset += length + 2;
+ total_length += length + 2;
+
+ if (total_length == num)
+ {
+ break;
+ }
+ }
+ }while(num );
+
+ if (total_length < num)
+ {
+#ifdef UNICODE
+ m_BufferedLines = &wbuf[total_length];
+#else
+ m_BufferedLines = &szBuffer[total_length];
+#endif
+ }
+
+ return ret;
+ }
+
+} // end of namespace System_
Added: trunk/reactos/tools/sysreg/file_reader.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/file_reader.h…
==============================================================================
--- trunk/reactos/tools/sysreg/file_reader.h (added)
+++ trunk/reactos/tools/sysreg/file_reader.h Tue Oct 24 15:21:17 2006
@@ -1,0 +1,91 @@
+#ifndef FILE_READER_H__
+#define FILE_READER_H__
+
+/* $Id: pipe_reader.h 24587 2006-10-20 21:14:08Z janderwald $
+ *
+ * PROJECT: System regression tool for ReactOS
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: tools/sysreg/conf_parser.h
+ * PURPOSE: pipe reader support
+ * PROGRAMMERS: Johannes Anderwald (johannes.anderwald at sbox tugraz at)
+ */
+
+
+#include "user_types.h"
+
+#include <vector>
+
+namespace System_
+{
+ using std::vector;
+//---------------------------------------------------------------------------------------
+///
+/// class FileReader
+///
+/// Description: this class implements reading from a file
+
+ class FileReader
+ {
+ public:
+//---------------------------------------------------------------------------------------
+///
+/// FileReader
+///
+/// Description: constructor of class FileReader
+
+ FileReader();
+
+//---------------------------------------------------------------------------------------
+///
+/// ~FileReader
+///
+/// Description: destructor of class FileReader
+
+ virtual ~FileReader();
+
+//---------------------------------------------------------------------------------------
+///
+/// openFile
+///
+/// Description: attempts to open a file. Returns true on success
+///
+/// @param filename name of the file to open
+/// @return bool
+
+ bool openFile(TCHAR const * filename);
+
+//---------------------------------------------------------------------------------------
+///
+/// closeFile
+///
+/// Description: attempts to close a file. Returns true on success
+///
+/// @return bool
+
+ bool closeFile();
+
+//---------------------------------------------------------------------------------------
+///
+/// readFile
+///
+/// Description: reads from file. The result is stored in a vector of strings
+///
+/// Note: returns true on success
+///
+
+ bool readFile(vector<string> & lines);
+
+
+
+ protected:
+ FILE * m_File;
+ string m_BufferedLines;
+
+
+ }; // end of class FileReader
+
+
+} // end of namespace System_
+
+
+#endif /* end of FILE_READER_H__ */
Modified: trunk/reactos/tools/sysreg/pipe_reader.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/pipe_reader.h…
==============================================================================
--- trunk/reactos/tools/sysreg/pipe_reader.h (original)
+++ trunk/reactos/tools/sysreg/pipe_reader.h Tue Oct 24 15:21:17 2006
@@ -6,7 +6,7 @@
* PROJECT: System regression tool for ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* FILE: tools/sysreg/conf_parser.h
- * PURPOSE: pipe reader support
+ * PURPOSE: file reading support
* PROGRAMMERS: Johannes Anderwald (johannes.anderwald at sbox tugraz at)
*/
Modified: trunk/reactos/tools/sysreg/rosboot_test.cpp
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/rosboot_test.…
==============================================================================
--- trunk/reactos/tools/sysreg/rosboot_test.cpp (original)
+++ trunk/reactos/tools/sysreg/rosboot_test.cpp Tue Oct 24 15:21:17 2006
@@ -12,6 +12,7 @@
#include "rosboot_test.h"
#include "pipe_reader.h"
#include "sym_file.h"
+#include "file_reader.h"
#include <iostream>
#include <vector>
@@ -46,6 +47,7 @@
using std::vector;
using System_::PipeReader;
using System_::SymbolFile;
+ using System_::FileReader;
string RosBootTest::VARIABLE_NAME = _T("ROSBOOT_CMD");
string RosBootTest::CLASS_NAME = _T("rosboot");
@@ -56,6 +58,7 @@
string RosBootTest::DELAY_READ = _T("ROSBOOT_DELAY_READ");
string RosBootTest::CHECK_POINT = _T("ROSBOOT_CHECK_POINT");
string RosBootTest::SYSREG_CHECKPOINT = _T("SYSREG_CHECKPOINT:");
+ string RosBootTest::CRITICAL_APP = _T("ROSBOOT_CRITICAL_APP");
//---------------------------------------------------------------------------------------
RosBootTest::RosBootTest() : RegressionTest(RosBootTest::CLASS_NAME), m_Timeout(60.0),
m_Delayread(0)
@@ -123,6 +126,7 @@
conf_parser.getStringValue (RosBootTest::CHECK_POINT, m_Checkpoint);
conf_parser.getStringValue (RosBootTest::PID_FILE, m_PidFile);
+ conf_parser.getStringValue (RosBootTest::CRITICAL_APP, m_CriticalApp);
if (!_tcscmp(debug_port.c_str(), _T("pipe")))
@@ -203,6 +207,15 @@
}
else if (line.find (_T("Unhandled exception")) != string::npos)
{
+ if (m_CriticalApp == _T("IGNORE"))
+ {
+ ///
+ /// ignoring all user-mode exceptions
+ ///
+ continue;
+ }
+
+
if (i + 3 >= debug_data.size ())
{
///
@@ -211,9 +224,6 @@
clear = false;
break;
}
-
- cerr << "UM detected" <<endl;
- state = DebugStateUMEDetected;
///
/// extract address from next line
@@ -224,8 +234,7 @@
if (pos == string::npos)
{
cerr << "Error: trace is not available (corrupted debug info"
<< endl;
- dumpCheckpoints();
- break;
+ continue;
}
@@ -240,20 +249,30 @@
if (pos == string::npos)
{
cerr << "Error: trace is not available (corrupted debug info"
<< endl;
- dumpCheckpoints();
- break;
- }
-
- modulename = modulename.substr (pos + 1, modulename.length () - pos);
- pos = modulename.find_last_of (_T("."));
+ continue;
+ }
+
+ string appname = modulename.substr (pos + 1, modulename.length () - pos);
+ if (m_CriticalApp.find (appname) == string::npos && m_CriticalApp.length ()
> 1)
+ {
+ /// the application is not in the list of
+ /// critical apps. Therefore we ignore the user-mode
+ /// exception
+
+ continue;
+ }
+
+ pos = appname.find_last_of (_T("."));
if (pos == string::npos)
{
cerr << "Error: trace is not available (corrupted debug info"
<< endl;
- dumpCheckpoints();
- break;
- }
-
- modulename = modulename.substr (0, pos);
+ continue;
+ }
+
+ modulename = appname.substr (0, pos);
+
+ cerr << "UM detected" <<endl;
+ state = DebugStateUMEDetected;
///
/// resolve address
@@ -382,57 +401,35 @@
if (m_PidFile != _T(""))
{
- FILE * pidfile = _tfopen(m_PidFile.c_str (), _T("rt"));
- if (pidfile)
- {
- TCHAR szBuffer[20];
- if (_fgetts(szBuffer, sizeof(szBuffer) / sizeof(TCHAR), pidfile))
- {
- pid = _ttoi(szBuffer);
- }
-
- }
- fclose(pidfile);
- }
-
- FILE * file = _tfopen(debug_log.c_str (), _T("rt"));
- if (!file)
+ FileReader file;
+ if (file.openFile(m_PidFile.c_str ()))
+ {
+ vector<string> lines;
+ file.readFile(lines);
+ if (lines.size())
+ {
+ string line = lines[0];
+ pid = _ttoi(line.c_str ());
+ }
+ file.closeFile();
+ }
+ }
+ FileReader file;
+ if (!file.openFile (debug_log.c_str ()))
{
cerr << "Error: failed to open debug log " << debug_log <<
endl;
pipe_reader.closePipe ();
return false;
}
- TCHAR szBuffer[1000];
+ vector<string> lines;
bool ret = true;
- vector<string> vect;
while(!pipe_reader.isEof ())
{
- if (_fgetts(szBuffer, sizeof(szBuffer) / sizeof(TCHAR), file))
- {
-
- string line = szBuffer;
-
- while(line.find (_T("\x10")) != string::npos)
- {
- line.erase(line.find(_T("\x10")), 1);
- }
-
- if (line[0] != _T('(') && vect.size() >=1)
- {
- string prev = vect[vect.size () -1];
- prev.insert (prev.length ()-1, line);
- vect.pop_back ();
- vect.push_back (prev);
-
- }
- else
- {
- vect.push_back (line);
- }
-
- DebugState state = checkDebugData(vect);
+ if (file.readFile (lines))
+ {
+ DebugState state = checkDebugData(lines);
if (state == DebugStateBSODDetected || state == DebugStateUMEDetected)
{
@@ -443,14 +440,26 @@
{
break;
}
-
- if (isTimeout(m_Timeout))
- {
- break;
- }
- }
- }
- fclose(file);
+ }
+ if (isTimeout(m_Timeout))
+ {
+ ///
+ /// timeout has been reached
+ ///
+ if (m_Checkpoint != _T(""))
+ {
+ ///
+ /// timeout was reached but
+ /// the checkpoint was not reached
+ /// we see this as a "hang"
+ ///
+ ret = false;
+ }
+ break;
+ }
+ }
+ file.closeFile ();
+
if (pid)
{
#ifdef __LINUX__
Modified: trunk/reactos/tools/sysreg/rosboot_test.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/rosboot_test.…
==============================================================================
--- trunk/reactos/tools/sysreg/rosboot_test.h (original)
+++ trunk/reactos/tools/sysreg/rosboot_test.h Tue Oct 24 15:21:17 2006
@@ -37,6 +37,7 @@
static string CHECK_POINT;
static string SYSREG_CHECKPOINT;
static string DELAY_READ;
+ static string CRITICAL_APP;
//---------------------------------------------------------------------------------------
///
@@ -138,6 +139,7 @@
double m_Timeout;
string m_PidFile;
string m_Checkpoint;
+ string m_CriticalApp;
vector <string> m_Checkpoints;
unsigned long m_Delayread;
Modified: trunk/reactos/tools/sysreg/sample.cfg
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/sample.cfg?re…
==============================================================================
--- trunk/reactos/tools/sysreg/sample.cfg (original)
+++ trunk/reactos/tools/sysreg/sample.cfg Tue Oct 24 15:21:17 2006
@@ -77,9 +77,12 @@
; This variable is the maximum runtime of the ROSBOOT_CMD. If the command
; runs longer than this value, sysreg exits with success mode;
;
+; Note: if you set the variable ROSBOOT_CHECK_POINT and the checkpoint is not reached
+; within this time, sysreg exits with failure mode
+;
; If the variable is not set, the default timeout is 1 minute
;
-ROSBOOT_TIME_OUT=180.0
+ROSBOOT_TIME_OUT=30.0
; ROSBOOT_CHECK_POINT
;
@@ -88,7 +91,23 @@
;
; CP_NAME is the value of the ROSBOOT_CHECK_POINT variable
-ROSBOOT_CHECKPOINT=USETUP_COMPLETED
+ROSBOOT_CHECK_POINT=USETUP_COMPLETE
+
+; ROSBOOT_CRITICAL_APP
+;
+; If an user-mode exception occurs in an critical application, i.e. setup.exe /
explorer.exe, sysreg will report
+; that the test has failed and quit debugging immediately
+;
+; if an user-mode exception occurs in any other application, sysreg will report the
exception but the exception
+; has no effect on the test result
+;
+; Note: if the value is set to IGNORE, sysreg will ignore all user-mode exceptions
+;
+; Note: if the variable is not set, then sysreg will stop on the first user-mode
exception
+;
+; seperate each application with an space
+ROSBOOT_CRITICAL_APP=setup.exe userinit.exe smss.exe winlogon.exe csrss.exe explorer.exe
+;ROSBOOT_CRITICAL_APP=setup.exe userinit.exe smss.exe winlogon.exe csrss.exe explorer.exe
lsass.exe
Added: trunk/reactos/tools/sysreg/user_types.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/user_types.h?…
==============================================================================
--- trunk/reactos/tools/sysreg/user_types.h (added)
+++ trunk/reactos/tools/sysreg/user_types.h Tue Oct 24 15:21:17 2006
@@ -1,0 +1,19 @@
+#ifndef USER_TYPES_H__
+#define USER_TYPES_H__
+
+/* $Id: rosboot_test.cpp 24585 2006-10-20 19:40:33Z janderwald $
+ *
+ * PROJECT: System regression tool for ReactOS
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: tools/sysreg/user_types.h
+ * PURPOSE: user types
+ * PROGRAMMERS: Johannes Anderwald (johannes.anderwald at sbox tugraz at)
+ */
+
+#include <string>
+#include <tchar.h>
+
+ typedef std::basic_string<TCHAR> string;
+
+
+#endif