| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "garnet/bin/zxdb/console/verbs.h" |
| |
| #include "garnet/bin/zxdb/client/session.h" |
| #include "garnet/bin/zxdb/console/command_utils.h" |
| #include "garnet/bin/zxdb/console/console.h" |
| #include "garnet/bin/zxdb/console/console_context.h" |
| |
| namespace zxdb { |
| |
| namespace { |
| |
| // new ------------------------------------------------------------------------- |
| |
| const char kNewShortHelp[] = "new: Create a new process/job context."; |
| const char kNewHelp[] = |
| R"(new |
| |
| Creates a new process/job context. |
| |
| A process context holds settings (binary name, command line arguments, etc.) |
| and possibly a running process. The new context will have no associated |
| process and can then be run or attached. |
| |
| A job context holds settings (filters, etc.) |
| and possibly a running job. The new context will have no associated |
| job and can then be run or attached. |
| |
| The settings from the current process/job context will be cloned. If an explicit |
| process/job is specified ("process 2 new"), the new process/job context will clone |
| the given one. The new context will be the active context. |
| |
| A process/job noun must be specified. Long-term we want to add support to "new" |
| multiple things. |
| |
| Hints |
| |
| To see a list of available process/job contexts, type "process" or "job". To switch the |
| active process context, specify its index ("(process|job) 3"). |
| |
| Example |
| |
| This example creates two processes, a "chrome" process, and attaches to |
| some existing process. |
| |
| [zxdb] run chrome |
| Process 1 Running 3456 chrome |
| [zxdb] process new |
| Process 2 created. |
| [zxdb] pr attach 1239 |
| Process 2 Running 1239 |
| |
| This example attaches to some existing job. |
| [zxdb] job new |
| Job 2 created. |
| [zxdb] j attach 1239 |
| Job 2 Running 1239 |
| )"; |
| Err DoNew(ConsoleContext* context, const Command& cmd) { |
| Err err = cmd.ValidateNouns({Noun::kProcess, Noun::kJob}); |
| if (err.has_error()) |
| return err; |
| |
| if (!cmd.HasNoun(Noun::kProcess) && !cmd.HasNoun(Noun::kJob)) |
| return Err("Use \"process new\" or \"job new\" to create a new context."); |
| |
| if (cmd.HasNoun(Noun::kJob)) { |
| JobContext* new_job_context = |
| context->session()->system().CreateNewJobContext(cmd.job_context()); |
| context->SetActiveJobContext(new_job_context); |
| Console::get()->Output(DescribeJobContext(context, new_job_context)); |
| } else { |
| Target* new_target = |
| context->session()->system().CreateNewTarget(cmd.target()); |
| context->SetActiveTarget(new_target); |
| Console::get()->Output(DescribeTarget(context, new_target)); |
| } |
| return Err(); |
| } |
| |
| |
| } // namespace |
| |
| void AppendSharedVerbs(std::map<Verb, VerbRecord>* verbs) { |
| (*verbs)[Verb::kNew] = VerbRecord(&DoNew, {"new"}, kNewShortHelp, kNewHelp, |
| CommandGroup::kGeneral); |
| } |
| |
| } // namespace zxdb |