diff -r 000000000000 -r c6b0df440bee dbgsrv/coredumpserver/test/rundump/src/rundump.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dbgsrv/coredumpserver/test/rundump/src/rundump.cpp Tue Mar 02 10:33:16 2010 +0530 @@ -0,0 +1,252 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "rundump.h" +#include +#include +#include // Console + +#include +#include +#include + + + +// Constants + +_LIT(KTextConsoleTitle, "Console"); +_LIT(KTextFailed, " failed, leave code = %d"); +_LIT(KTextPressAnyKey, " [press any key]\n"); +_LIT(KCrashAppFileName,"Z:\\sys\\bin\\crashapp.exe"); + +// Global Variables + +LOCAL_D CConsoleBase* console; // write all messages to this + + +// Local Functions + +LOCAL_C void MainL() + { + TUid SELF_UID_V2 = { 0x102836bb }; + TUid WRITER_UID = { 0x102831E4 }; + TUid CDS_UID = { 0x10282FE5 }; + TUid UTRACE_UID = { 0x102836BA }; + TUid DEXC_UID = { 0x102832C5 }; + + RCoreDumpSession cdsSess; + CleanupClosePushL(cdsSess); + cdsSess.Connect(); + + // + // add your program code here, example code below + // + console->Write(_L("Starting megadump\n")); + console->Write(_L("SELF or UTRACE or DEXC? (s/u/d)")); + TChar inp = console->Getch(); + + //Load plugins + TPluginRequest req; + req.iPluginType = TPluginRequest::EFormatter; + req.iLoad = ETrue; + + switch(inp) + { + case('s'): + { + req.iUid = SELF_UID_V2; + console->Write(_L("\nLoading SELF formatter V2\n")); + break; + } + case('u'): + { + req.iUid = UTRACE_UID; + console->Write(_L("\nLoading UTRACE formatter\n")); + break; + } + case('d'): + { + req.iUid = DEXC_UID; + console->Write(_L("\nLoading DEXC Formatter")); + return; + } + default: + { + console->Write(_L("\nNot an option")); + return; + } + + } + + TBuf<10> crashAppParam; + console->Write(_L("Should crashapp write trace data? (y/n)\n")); + inp = console->Getch(); + switch(inp) + { + case('y'): + { + console->Write(_L("Crashapp will write trace data\n")); + crashAppParam.Append(_L("-d1 -t")); + break; + } + default: + { + console->Write(_L("Crashapp will not write any trace data\n")); + crashAppParam.Append(_L("-d1")); + break; + } + } + + //Start the process that we intend to crash.... + RProcess crashProcess; + CleanupClosePushL(crashProcess); + crashProcess.Create( KCrashAppFileName, crashAppParam); + + cdsSess.PluginRequestL( req ); + + TPluginRequest req2; + req2.iUid = WRITER_UID; + req2.iPluginType = TPluginRequest::EWriter; + req2.iLoad = ETrue; + + console->Write(_L("Loading File writer\n")); + cdsSess.PluginRequestL( req2 ); + + _LIT( KPostCrashEventActionPrompt, "Action After Crash:\n 0-None,\n 1-Resume Thread,\n 2-Resume Process,\n 4-Kill Process" ); + _LIT( KFilePathPrompt, "not_important" ); + _LIT( KCrashFileName, "e:\\file"); + + console->Write(_L("Configuring CDS\n")); + DoConfigureL(2, CDS_UID.iUid, COptionConfig::ECoreDumpServer, COptionConfig::ETUInt, KPostCrashEventActionPrompt, + 1, KNullDesC, 4, KNullDesC, 0, cdsSess); + + console->Write(_L("Configuring Writer\n")); + DoConfigureL((TInt)(CCrashDataSave::ECoreFilePath), WRITER_UID.iUid, COptionConfig::EWriterPlugin, COptionConfig::ETFileName, + KFilePathPrompt, 1, KNullDesC, 0, KCrashFileName, 0, cdsSess); + +/* if(trace) + { + console->Write(_L("Configuring Trace\n")); + DoConfigureL(0, UTRACE_UID.iUid, COptionConfig::EFormatterPlugin, COptionConfig::ETInt, + KFilePathPrompt, 1, KNullDesC, 1, KCrashFileName, 0, cdsSess); + }*/ + + console->Write(_L("Observing\n")); + cdsSess.ObservationRequestL( KCrashAppFileName, KCrashAppFileName, ETrue) ; + + console->Write(_L("Starting process\n")); + crashProcess.Resume(); + CleanupStack::PopAndDestroy(&crashProcess); + CleanupStack::PopAndDestroy(&cdsSess); + + console->Write(_L("Any key to exit....")); + console->Getch(); + + } + +void DoConfigureL(const TUint32& aIndex, + const TUint32& aUID, + const COptionConfig::TParameterSource& aSource, + const COptionConfig::TOptionType& aType, + const TDesC& aPrompt, + const TUint32& aNumOptions, + const TDesC& aOptions, + const TInt32& aVal, + const TDesC& aStrValue, + const TUint aInstance, + const RCoreDumpSession &aSess) +/** +* @return void +* @param aIndex Internal index to the component that owns the object +* @param aUID UID of the component that owns the object +* @param aSource Type of component that owns the object +* @param aType Type of parameter +* @param aPrompt Prompt to present to user +* @param aNumOptions Number of options that the parameter can be set to. Only applies if type is ETMultiEntryEnum. +* @param aOptions Comma separated list of options. Applies to ETMultiEntryEnum and ETBool +* @param aVal Integer value. Applies to ETInt, ETUInt, ETBool +* @param aStrValue String value. Applies to ETString, ETFileName, ETMultiEntry, ETBool +*/ + { + COptionConfig * config; + + config = COptionConfig::NewL( aIndex, + aUID, + aSource, + aType, + aPrompt, + aNumOptions, + aOptions, + aVal, + aStrValue); + + CleanupStack::PushL(config); + + config->Instance(aInstance); + + //Configure now... + aSess.SetConfigParameterL(*config); + + CleanupStack::PopAndDestroy(config); + } + + +LOCAL_C void DoStartL() + { + // Create active scheduler (to run active objects) + CActiveScheduler* scheduler = new (ELeave) CActiveScheduler(); + CleanupStack::PushL(scheduler); + CActiveScheduler::Install(scheduler); + + TRAPD(err, MainL()); + + if(err != KErrNone) + { + console->Printf(_L("All is not well in the land of megadump. Error = %d\n"), err); + } + + // Delete active scheduler + CleanupStack::PopAndDestroy(scheduler); + } + + +// Global Functions + +GLDEF_C TInt E32Main() + { + // Create cleanup stack + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + + // Create output console + TRAPD(createError, console = Console::NewL(KTextConsoleTitle, TSize(KConsFullScreen,KConsFullScreen))); + if (createError) + return createError; + + // Run application code inside TRAP harness, wait keypress when terminated + TRAPD(mainError, DoStartL()); + if (mainError) + console->Printf(KTextFailed, mainError); + console->Printf(KTextPressAnyKey); + console->Getch(); + + delete console; + delete cleanup; + __UHEAP_MARKEND; + return KErrNone; + } + + +