1*30fdc8d8SChris Lattner //===-- CommandObjectLog.cpp ------------------------------------*- C++ -*-===// 2*30fdc8d8SChris Lattner // 3*30fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 4*30fdc8d8SChris Lattner // 5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 7*30fdc8d8SChris Lattner // 8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 9*30fdc8d8SChris Lattner 10*30fdc8d8SChris Lattner #include "CommandObjectLog.h" 11*30fdc8d8SChris Lattner 12*30fdc8d8SChris Lattner // C Includes 13*30fdc8d8SChris Lattner // C++ Includes 14*30fdc8d8SChris Lattner // Other libraries and framework includes 15*30fdc8d8SChris Lattner // Project includes 16*30fdc8d8SChris Lattner #include "lldb/lldb-private-log.h" 17*30fdc8d8SChris Lattner 18*30fdc8d8SChris Lattner #include "lldb/Core/Args.h" 19*30fdc8d8SChris Lattner #include "lldb/Core/Debugger.h" 20*30fdc8d8SChris Lattner #include "lldb/Core/FileSpec.h" 21*30fdc8d8SChris Lattner #include "lldb/Core/Log.h" 22*30fdc8d8SChris Lattner #include "lldb/Core/Module.h" 23*30fdc8d8SChris Lattner #include "lldb/Core/Options.h" 24*30fdc8d8SChris Lattner #include "lldb/Core/RegularExpression.h" 25*30fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 26*30fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 27*30fdc8d8SChris Lattner #include "lldb/Core/Timer.h" 28*30fdc8d8SChris Lattner 29*30fdc8d8SChris Lattner #include "lldb/Interpreter/CommandContext.h" 30*30fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h" 31*30fdc8d8SChris Lattner 32*30fdc8d8SChris Lattner #include "lldb/Symbol/LineTable.h" 33*30fdc8d8SChris Lattner #include "lldb/Symbol/ObjectFile.h" 34*30fdc8d8SChris Lattner #include "lldb/Symbol/SymbolFile.h" 35*30fdc8d8SChris Lattner #include "lldb/Symbol/SymbolVendor.h" 36*30fdc8d8SChris Lattner 37*30fdc8d8SChris Lattner #include "lldb/Target/Process.h" 38*30fdc8d8SChris Lattner #include "lldb/Target/Target.h" 39*30fdc8d8SChris Lattner 40*30fdc8d8SChris Lattner using namespace lldb; 41*30fdc8d8SChris Lattner using namespace lldb_private; 42*30fdc8d8SChris Lattner 43*30fdc8d8SChris Lattner 44*30fdc8d8SChris Lattner static LogChannelSP 45*30fdc8d8SChris Lattner GetLogChannelPluginForChannel (const char *channel) 46*30fdc8d8SChris Lattner { 47*30fdc8d8SChris Lattner std::string log_channel_plugin_name(channel); 48*30fdc8d8SChris Lattner log_channel_plugin_name += LogChannel::GetPluginSuffix(); 49*30fdc8d8SChris Lattner LogChannelSP log_channel_sp (LogChannel::FindPlugin (log_channel_plugin_name.c_str())); 50*30fdc8d8SChris Lattner return log_channel_sp; 51*30fdc8d8SChris Lattner } 52*30fdc8d8SChris Lattner 53*30fdc8d8SChris Lattner 54*30fdc8d8SChris Lattner class CommandObjectLogEnable : public CommandObject 55*30fdc8d8SChris Lattner { 56*30fdc8d8SChris Lattner public: 57*30fdc8d8SChris Lattner //------------------------------------------------------------------ 58*30fdc8d8SChris Lattner // Constructors and Destructors 59*30fdc8d8SChris Lattner //------------------------------------------------------------------ 60*30fdc8d8SChris Lattner CommandObjectLogEnable() : 61*30fdc8d8SChris Lattner CommandObject ("log enable", 62*30fdc8d8SChris Lattner "Enable logging for a single log channel.", 63*30fdc8d8SChris Lattner "log enable [<cmd-options>] <channel>") 64*30fdc8d8SChris Lattner { 65*30fdc8d8SChris Lattner } 66*30fdc8d8SChris Lattner 67*30fdc8d8SChris Lattner virtual 68*30fdc8d8SChris Lattner ~CommandObjectLogEnable() 69*30fdc8d8SChris Lattner { 70*30fdc8d8SChris Lattner } 71*30fdc8d8SChris Lattner 72*30fdc8d8SChris Lattner Options * 73*30fdc8d8SChris Lattner GetOptions () 74*30fdc8d8SChris Lattner { 75*30fdc8d8SChris Lattner return &m_options; 76*30fdc8d8SChris Lattner } 77*30fdc8d8SChris Lattner 78*30fdc8d8SChris Lattner virtual bool 79*30fdc8d8SChris Lattner Execute (Args& args, 80*30fdc8d8SChris Lattner CommandContext *context, 81*30fdc8d8SChris Lattner CommandInterpreter *interpreter, 82*30fdc8d8SChris Lattner CommandReturnObject &result) 83*30fdc8d8SChris Lattner { 84*30fdc8d8SChris Lattner if (args.GetArgumentCount() < 1) 85*30fdc8d8SChris Lattner { 86*30fdc8d8SChris Lattner result.GetErrorStream() << m_cmd_syntax.c_str(); 87*30fdc8d8SChris Lattner } 88*30fdc8d8SChris Lattner else 89*30fdc8d8SChris Lattner { 90*30fdc8d8SChris Lattner Log::Callbacks log_callbacks; 91*30fdc8d8SChris Lattner 92*30fdc8d8SChris Lattner std::string channel(args.GetArgumentAtIndex(0)); 93*30fdc8d8SChris Lattner args.Shift (); // Shift off the channel 94*30fdc8d8SChris Lattner StreamSP log_stream_sp; 95*30fdc8d8SChris Lattner 96*30fdc8d8SChris Lattner if (m_options.log_file.empty()) 97*30fdc8d8SChris Lattner { 98*30fdc8d8SChris Lattner std::string log_file("<lldb.debugger>"); 99*30fdc8d8SChris Lattner LogStreamMap::iterator pos = m_log_streams.find(log_file); 100*30fdc8d8SChris Lattner if (pos == m_log_streams.end()) 101*30fdc8d8SChris Lattner { 102*30fdc8d8SChris Lattner log_stream_sp = Log::GetStreamForSTDOUT (); 103*30fdc8d8SChris Lattner if (log_stream_sp) 104*30fdc8d8SChris Lattner m_log_streams[log_file] = log_stream_sp; 105*30fdc8d8SChris Lattner } 106*30fdc8d8SChris Lattner else 107*30fdc8d8SChris Lattner log_stream_sp = pos->second; 108*30fdc8d8SChris Lattner } 109*30fdc8d8SChris Lattner else 110*30fdc8d8SChris Lattner { 111*30fdc8d8SChris Lattner LogStreamMap::iterator pos = m_log_streams.find(m_options.log_file); 112*30fdc8d8SChris Lattner if (pos == m_log_streams.end()) 113*30fdc8d8SChris Lattner { 114*30fdc8d8SChris Lattner log_stream_sp.reset (new StreamFile (m_options.log_file.c_str(), "w")); 115*30fdc8d8SChris Lattner m_log_streams[m_options.log_file] = log_stream_sp; 116*30fdc8d8SChris Lattner } 117*30fdc8d8SChris Lattner else 118*30fdc8d8SChris Lattner log_stream_sp = pos->second; 119*30fdc8d8SChris Lattner } 120*30fdc8d8SChris Lattner assert (log_stream_sp.get()); 121*30fdc8d8SChris Lattner uint32_t log_options = m_options.log_options; 122*30fdc8d8SChris Lattner if (log_options == 0) 123*30fdc8d8SChris Lattner log_options = LLDB_LOG_OPTION_PREPEND_THREAD_NAME | LLDB_LOG_OPTION_THREADSAFE; 124*30fdc8d8SChris Lattner if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 125*30fdc8d8SChris Lattner { 126*30fdc8d8SChris Lattner log_callbacks.enable (log_stream_sp, log_options, args, &result.GetErrorStream()); 127*30fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 128*30fdc8d8SChris Lattner } 129*30fdc8d8SChris Lattner else 130*30fdc8d8SChris Lattner { 131*30fdc8d8SChris Lattner LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 132*30fdc8d8SChris Lattner if (log_channel_sp) 133*30fdc8d8SChris Lattner { 134*30fdc8d8SChris Lattner if (log_channel_sp->Enable (log_stream_sp, log_options, &result.GetErrorStream(), args)) 135*30fdc8d8SChris Lattner { 136*30fdc8d8SChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 137*30fdc8d8SChris Lattner } 138*30fdc8d8SChris Lattner else 139*30fdc8d8SChris Lattner { 140*30fdc8d8SChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", channel.c_str()); 141*30fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 142*30fdc8d8SChris Lattner } 143*30fdc8d8SChris Lattner } 144*30fdc8d8SChris Lattner else 145*30fdc8d8SChris Lattner { 146*30fdc8d8SChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", channel.c_str()); 147*30fdc8d8SChris Lattner result.SetStatus (eReturnStatusFailed); 148*30fdc8d8SChris Lattner } 149*30fdc8d8SChris Lattner } 150*30fdc8d8SChris Lattner } 151*30fdc8d8SChris Lattner return result.Succeeded(); 152*30fdc8d8SChris Lattner } 153*30fdc8d8SChris Lattner 154*30fdc8d8SChris Lattner 155*30fdc8d8SChris Lattner class CommandOptions : public Options 156*30fdc8d8SChris Lattner { 157*30fdc8d8SChris Lattner public: 158*30fdc8d8SChris Lattner 159*30fdc8d8SChris Lattner CommandOptions () : 160*30fdc8d8SChris Lattner Options (), 161*30fdc8d8SChris Lattner log_file (), 162*30fdc8d8SChris Lattner log_options (0) 163*30fdc8d8SChris Lattner { 164*30fdc8d8SChris Lattner } 165*30fdc8d8SChris Lattner 166*30fdc8d8SChris Lattner 167*30fdc8d8SChris Lattner virtual 168*30fdc8d8SChris Lattner ~CommandOptions () 169*30fdc8d8SChris Lattner { 170*30fdc8d8SChris Lattner } 171*30fdc8d8SChris Lattner 172*30fdc8d8SChris Lattner virtual Error 173*30fdc8d8SChris Lattner SetOptionValue (int option_idx, const char *option_arg) 174*30fdc8d8SChris Lattner { 175*30fdc8d8SChris Lattner Error error; 176*30fdc8d8SChris Lattner char short_option = (char) m_getopt_table[option_idx].val; 177*30fdc8d8SChris Lattner 178*30fdc8d8SChris Lattner switch (short_option) 179*30fdc8d8SChris Lattner { 180*30fdc8d8SChris Lattner case 'f': log_file = option_arg; break; 181*30fdc8d8SChris Lattner case 't': log_options |= LLDB_LOG_OPTION_THREADSAFE; break; 182*30fdc8d8SChris Lattner case 'v': log_options |= LLDB_LOG_OPTION_VERBOSE; break; 183*30fdc8d8SChris Lattner case 'g': log_options |= LLDB_LOG_OPTION_DEBUG; break; 184*30fdc8d8SChris Lattner case 's': log_options |= LLDB_LOG_OPTION_PREPEND_SEQUENCE; break; 185*30fdc8d8SChris Lattner case 'T': log_options |= LLDB_LOG_OPTION_PREPEND_TIMESTAMP; break; 186*30fdc8d8SChris Lattner case 'p': log_options |= LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD;break; 187*30fdc8d8SChris Lattner case 'n': log_options |= LLDB_LOG_OPTION_PREPEND_THREAD_NAME; break; 188*30fdc8d8SChris Lattner default: 189*30fdc8d8SChris Lattner error.SetErrorStringWithFormat ("Unrecognized option '%c'\n", short_option); 190*30fdc8d8SChris Lattner break; 191*30fdc8d8SChris Lattner } 192*30fdc8d8SChris Lattner 193*30fdc8d8SChris Lattner return error; 194*30fdc8d8SChris Lattner } 195*30fdc8d8SChris Lattner 196*30fdc8d8SChris Lattner void 197*30fdc8d8SChris Lattner ResetOptionValues () 198*30fdc8d8SChris Lattner { 199*30fdc8d8SChris Lattner Options::ResetOptionValues(); 200*30fdc8d8SChris Lattner log_file.clear(); 201*30fdc8d8SChris Lattner log_options = 0; 202*30fdc8d8SChris Lattner } 203*30fdc8d8SChris Lattner 204*30fdc8d8SChris Lattner const lldb::OptionDefinition* 205*30fdc8d8SChris Lattner GetDefinitions () 206*30fdc8d8SChris Lattner { 207*30fdc8d8SChris Lattner return g_option_table; 208*30fdc8d8SChris Lattner } 209*30fdc8d8SChris Lattner 210*30fdc8d8SChris Lattner // Options table: Required for subclasses of Options. 211*30fdc8d8SChris Lattner 212*30fdc8d8SChris Lattner static lldb::OptionDefinition g_option_table[]; 213*30fdc8d8SChris Lattner 214*30fdc8d8SChris Lattner // Instance variables to hold the values for command options. 215*30fdc8d8SChris Lattner 216*30fdc8d8SChris Lattner std::string log_file; 217*30fdc8d8SChris Lattner uint32_t log_options; 218*30fdc8d8SChris Lattner }; 219*30fdc8d8SChris Lattner 220*30fdc8d8SChris Lattner protected: 221*30fdc8d8SChris Lattner typedef std::map<std::string, StreamSP> LogStreamMap; 222*30fdc8d8SChris Lattner CommandOptions m_options; 223*30fdc8d8SChris Lattner LogStreamMap m_log_streams; 224*30fdc8d8SChris Lattner }; 225*30fdc8d8SChris Lattner 226*30fdc8d8SChris Lattner lldb::OptionDefinition 227*30fdc8d8SChris Lattner CommandObjectLogEnable::CommandOptions::g_option_table[] = 228*30fdc8d8SChris Lattner { 229*30fdc8d8SChris Lattner { 0, false, "file", 'f', required_argument, NULL, 0, "<filename>", "Set the destination file to log to."}, 230*30fdc8d8SChris Lattner { 0, false, "threadsafe", 't', no_argument, NULL, 0, NULL, "Enable thread safe logging to avoid interweaved log lines." }, 231*30fdc8d8SChris Lattner { 0, false, "verbose", 'v', no_argument, NULL, 0, NULL, "Enable verbose logging." }, 232*30fdc8d8SChris Lattner { 0, false, "debug", 'g', no_argument, NULL, 0, NULL, "Enable debug logging." }, 233*30fdc8d8SChris Lattner { 0, false, "sequence", 's', no_argument, NULL, 0, NULL, "Prepend all log lines with an increasing integer sequence id." }, 234*30fdc8d8SChris Lattner { 0, false, "timestamp", 'T', no_argument, NULL, 0, NULL, "Prepend all log lines with a timestamp." }, 235*30fdc8d8SChris Lattner { 0, false, "pid-tid", 'p', no_argument, NULL, 0, NULL, "Prepend all log lines with the process and thread ID that generates the log line." }, 236*30fdc8d8SChris Lattner { 0, false, "thread-name",'n', no_argument, NULL, 0, NULL, "Prepend all log lines with the thread name for the thread that generates the log line." }, 237*30fdc8d8SChris Lattner { 0, false, NULL, 0, 0, NULL, 0, NULL, NULL } 238*30fdc8d8SChris Lattner }; 239*30fdc8d8SChris Lattner 240*30fdc8d8SChris Lattner class CommandObjectLogDisable : public CommandObject 241*30fdc8d8SChris Lattner { 242*30fdc8d8SChris Lattner public: 243*30fdc8d8SChris Lattner //------------------------------------------------------------------ 244*30fdc8d8SChris Lattner // Constructors and Destructors 245*30fdc8d8SChris Lattner //------------------------------------------------------------------ 246*30fdc8d8SChris Lattner CommandObjectLogDisable() : 247*30fdc8d8SChris Lattner CommandObject ("log disable", 248*30fdc8d8SChris Lattner "Disable one or more log channels.", 249*30fdc8d8SChris Lattner "log disable <channel> [<channel> ...]") 250*30fdc8d8SChris Lattner { 251*30fdc8d8SChris Lattner } 252*30fdc8d8SChris Lattner 253*30fdc8d8SChris Lattner virtual 254*30fdc8d8SChris Lattner ~CommandObjectLogDisable() 255*30fdc8d8SChris Lattner { 256*30fdc8d8SChris Lattner } 257*30fdc8d8SChris Lattner 258*30fdc8d8SChris Lattner virtual bool 259*30fdc8d8SChris Lattner Execute (Args& args, 260*30fdc8d8SChris Lattner CommandContext *context, 261*30fdc8d8SChris Lattner CommandInterpreter *interpreter, 262*30fdc8d8SChris Lattner CommandReturnObject &result) 263*30fdc8d8SChris Lattner { 264*30fdc8d8SChris Lattner const size_t argc = args.GetArgumentCount(); 265*30fdc8d8SChris Lattner if (argc == 0) 266*30fdc8d8SChris Lattner { 267*30fdc8d8SChris Lattner result.GetErrorStream() << m_cmd_syntax.c_str(); 268*30fdc8d8SChris Lattner } 269*30fdc8d8SChris Lattner else 270*30fdc8d8SChris Lattner { 271*30fdc8d8SChris Lattner for (size_t i=0; i<argc; ++i) 272*30fdc8d8SChris Lattner { 273*30fdc8d8SChris Lattner Log::Callbacks log_callbacks; 274*30fdc8d8SChris Lattner 275*30fdc8d8SChris Lattner std::string channel(args.GetArgumentAtIndex(i)); 276*30fdc8d8SChris Lattner if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 277*30fdc8d8SChris Lattner { 278*30fdc8d8SChris Lattner log_callbacks.disable (); 279*30fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 280*30fdc8d8SChris Lattner } 281*30fdc8d8SChris Lattner else if (channel == "all") 282*30fdc8d8SChris Lattner { 283*30fdc8d8SChris Lattner Log::DisableAllLogChannels(); 284*30fdc8d8SChris Lattner } 285*30fdc8d8SChris Lattner else 286*30fdc8d8SChris Lattner { 287*30fdc8d8SChris Lattner LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 288*30fdc8d8SChris Lattner if (log_channel_sp) 289*30fdc8d8SChris Lattner { 290*30fdc8d8SChris Lattner log_channel_sp->Disable(); 291*30fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 292*30fdc8d8SChris Lattner } 293*30fdc8d8SChris Lattner else 294*30fdc8d8SChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0)); 295*30fdc8d8SChris Lattner } 296*30fdc8d8SChris Lattner } 297*30fdc8d8SChris Lattner } 298*30fdc8d8SChris Lattner return result.Succeeded(); 299*30fdc8d8SChris Lattner } 300*30fdc8d8SChris Lattner }; 301*30fdc8d8SChris Lattner 302*30fdc8d8SChris Lattner class CommandObjectLogList : public CommandObject 303*30fdc8d8SChris Lattner { 304*30fdc8d8SChris Lattner public: 305*30fdc8d8SChris Lattner //------------------------------------------------------------------ 306*30fdc8d8SChris Lattner // Constructors and Destructors 307*30fdc8d8SChris Lattner //------------------------------------------------------------------ 308*30fdc8d8SChris Lattner CommandObjectLogList() : 309*30fdc8d8SChris Lattner CommandObject ("log list", 310*30fdc8d8SChris Lattner "List the log categories for one or more log channels.", 311*30fdc8d8SChris Lattner "log list <channel> [<channel> ...]") 312*30fdc8d8SChris Lattner { 313*30fdc8d8SChris Lattner } 314*30fdc8d8SChris Lattner 315*30fdc8d8SChris Lattner virtual 316*30fdc8d8SChris Lattner ~CommandObjectLogList() 317*30fdc8d8SChris Lattner { 318*30fdc8d8SChris Lattner } 319*30fdc8d8SChris Lattner 320*30fdc8d8SChris Lattner virtual bool 321*30fdc8d8SChris Lattner Execute (Args& args, 322*30fdc8d8SChris Lattner CommandContext *context, 323*30fdc8d8SChris Lattner CommandInterpreter *interpreter, 324*30fdc8d8SChris Lattner CommandReturnObject &result) 325*30fdc8d8SChris Lattner { 326*30fdc8d8SChris Lattner const size_t argc = args.GetArgumentCount(); 327*30fdc8d8SChris Lattner if (argc == 0) 328*30fdc8d8SChris Lattner { 329*30fdc8d8SChris Lattner Log::ListAllLogChannels (&result.GetOutputStream()); 330*30fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 331*30fdc8d8SChris Lattner } 332*30fdc8d8SChris Lattner else 333*30fdc8d8SChris Lattner { 334*30fdc8d8SChris Lattner for (size_t i=0; i<argc; ++i) 335*30fdc8d8SChris Lattner { 336*30fdc8d8SChris Lattner Log::Callbacks log_callbacks; 337*30fdc8d8SChris Lattner 338*30fdc8d8SChris Lattner std::string channel(args.GetArgumentAtIndex(i)); 339*30fdc8d8SChris Lattner if (Log::GetLogChannelCallbacks (channel.c_str(), log_callbacks)) 340*30fdc8d8SChris Lattner { 341*30fdc8d8SChris Lattner log_callbacks.list_categories (&result.GetOutputStream()); 342*30fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 343*30fdc8d8SChris Lattner } 344*30fdc8d8SChris Lattner else if (channel == "all") 345*30fdc8d8SChris Lattner { 346*30fdc8d8SChris Lattner Log::ListAllLogChannels (&result.GetOutputStream()); 347*30fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 348*30fdc8d8SChris Lattner } 349*30fdc8d8SChris Lattner else 350*30fdc8d8SChris Lattner { 351*30fdc8d8SChris Lattner LogChannelSP log_channel_sp (GetLogChannelPluginForChannel(channel.c_str())); 352*30fdc8d8SChris Lattner if (log_channel_sp) 353*30fdc8d8SChris Lattner { 354*30fdc8d8SChris Lattner log_channel_sp->ListCategories(&result.GetOutputStream()); 355*30fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 356*30fdc8d8SChris Lattner } 357*30fdc8d8SChris Lattner else 358*30fdc8d8SChris Lattner result.AppendErrorWithFormat("Invalid log channel '%s'.\n", args.GetArgumentAtIndex(0)); 359*30fdc8d8SChris Lattner } 360*30fdc8d8SChris Lattner } 361*30fdc8d8SChris Lattner } 362*30fdc8d8SChris Lattner return result.Succeeded(); 363*30fdc8d8SChris Lattner } 364*30fdc8d8SChris Lattner }; 365*30fdc8d8SChris Lattner 366*30fdc8d8SChris Lattner class CommandObjectLogTimer : public CommandObject 367*30fdc8d8SChris Lattner { 368*30fdc8d8SChris Lattner public: 369*30fdc8d8SChris Lattner //------------------------------------------------------------------ 370*30fdc8d8SChris Lattner // Constructors and Destructors 371*30fdc8d8SChris Lattner //------------------------------------------------------------------ 372*30fdc8d8SChris Lattner CommandObjectLogTimer() : 373*30fdc8d8SChris Lattner CommandObject ("log timers", 374*30fdc8d8SChris Lattner "Enable, disable, dump, and reset LLDB internal performance timers.", 375*30fdc8d8SChris Lattner "log timers < enable | disable | dump | reset >") 376*30fdc8d8SChris Lattner { 377*30fdc8d8SChris Lattner } 378*30fdc8d8SChris Lattner 379*30fdc8d8SChris Lattner virtual 380*30fdc8d8SChris Lattner ~CommandObjectLogTimer() 381*30fdc8d8SChris Lattner { 382*30fdc8d8SChris Lattner } 383*30fdc8d8SChris Lattner 384*30fdc8d8SChris Lattner virtual bool 385*30fdc8d8SChris Lattner Execute (Args& args, 386*30fdc8d8SChris Lattner CommandContext *context, 387*30fdc8d8SChris Lattner CommandInterpreter *interpreter, 388*30fdc8d8SChris Lattner CommandReturnObject &result) 389*30fdc8d8SChris Lattner { 390*30fdc8d8SChris Lattner const size_t argc = args.GetArgumentCount(); 391*30fdc8d8SChris Lattner result.SetStatus(eReturnStatusFailed); 392*30fdc8d8SChris Lattner 393*30fdc8d8SChris Lattner if (argc == 1) 394*30fdc8d8SChris Lattner { 395*30fdc8d8SChris Lattner const char *sub_command = args.GetArgumentAtIndex(0); 396*30fdc8d8SChris Lattner 397*30fdc8d8SChris Lattner if (strcasecmp(sub_command, "enable") == 0) 398*30fdc8d8SChris Lattner { 399*30fdc8d8SChris Lattner Timer::SetDisplayDepth (UINT32_MAX); 400*30fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishNoResult); 401*30fdc8d8SChris Lattner } 402*30fdc8d8SChris Lattner else if (strcasecmp(sub_command, "disable") == 0) 403*30fdc8d8SChris Lattner { 404*30fdc8d8SChris Lattner Timer::DumpCategoryTimes (&result.GetOutputStream()); 405*30fdc8d8SChris Lattner Timer::SetDisplayDepth (0); 406*30fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 407*30fdc8d8SChris Lattner } 408*30fdc8d8SChris Lattner else if (strcasecmp(sub_command, "dump") == 0) 409*30fdc8d8SChris Lattner { 410*30fdc8d8SChris Lattner Timer::DumpCategoryTimes (&result.GetOutputStream()); 411*30fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 412*30fdc8d8SChris Lattner } 413*30fdc8d8SChris Lattner else if (strcasecmp(sub_command, "reset") == 0) 414*30fdc8d8SChris Lattner { 415*30fdc8d8SChris Lattner Timer::ResetCategoryTimes (); 416*30fdc8d8SChris Lattner result.SetStatus(eReturnStatusSuccessFinishResult); 417*30fdc8d8SChris Lattner } 418*30fdc8d8SChris Lattner 419*30fdc8d8SChris Lattner } 420*30fdc8d8SChris Lattner if (!result.Succeeded()) 421*30fdc8d8SChris Lattner { 422*30fdc8d8SChris Lattner result.AppendError("Missing subcommand"); 423*30fdc8d8SChris Lattner result.AppendErrorWithFormat("Usage: %s\n", m_cmd_syntax.c_str()); 424*30fdc8d8SChris Lattner } 425*30fdc8d8SChris Lattner return result.Succeeded(); 426*30fdc8d8SChris Lattner } 427*30fdc8d8SChris Lattner }; 428*30fdc8d8SChris Lattner 429*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 430*30fdc8d8SChris Lattner // CommandObjectLog constructor 431*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 432*30fdc8d8SChris Lattner CommandObjectLog::CommandObjectLog(CommandInterpreter *interpreter) : 433*30fdc8d8SChris Lattner CommandObjectMultiword ("log", 434*30fdc8d8SChris Lattner "A set of commands for operating on logs.", 435*30fdc8d8SChris Lattner "log <command> [<command-options>]") 436*30fdc8d8SChris Lattner { 437*30fdc8d8SChris Lattner LoadSubCommand (CommandObjectSP (new CommandObjectLogEnable), "enable", interpreter); 438*30fdc8d8SChris Lattner LoadSubCommand (CommandObjectSP (new CommandObjectLogDisable), "disable", interpreter); 439*30fdc8d8SChris Lattner LoadSubCommand (CommandObjectSP (new CommandObjectLogList), "list", interpreter); 440*30fdc8d8SChris Lattner LoadSubCommand (CommandObjectSP (new CommandObjectLogTimer), "timers", interpreter); 441*30fdc8d8SChris Lattner } 442*30fdc8d8SChris Lattner 443*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 444*30fdc8d8SChris Lattner // Destructor 445*30fdc8d8SChris Lattner //---------------------------------------------------------------------- 446*30fdc8d8SChris Lattner CommandObjectLog::~CommandObjectLog() 447*30fdc8d8SChris Lattner { 448*30fdc8d8SChris Lattner } 449*30fdc8d8SChris Lattner 450*30fdc8d8SChris Lattner 451*30fdc8d8SChris Lattner 452*30fdc8d8SChris Lattner 453