CommandObjectThread.cpp revision 36da2aa6dc5ad9994b638ed09eb81c44cc05540b
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectThread.cpp ---------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectThread.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 18f59388aa57559d7d074613d65b88abacfd699845Jim Ingham#include "lldb/lldb-private.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/SourceManager.h" 21cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Host.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h" 2449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Interpreter/Options.h" 2549ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h" 2649ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Function.h" 2749ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/LineTable.h" 2849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/LineEntry.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepInstruction.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepOut.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepRange.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepInRange.h" 3849ce8969d3154e1560106cfe530444c09410f217Greg Clayton 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadBacktrace 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectThreadBacktrace : public CommandObjectParsed 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 528ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham class CommandOptions : public Options 538ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 548ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham public: 558ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 56f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 57f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options(interpreter) 588ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 59143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton // Keep default values of all options in one place: OptionParsingStarting () 60143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting (); 618ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 628ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 638ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham virtual 648ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham ~CommandOptions () 658ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 668ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 678ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 688ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham virtual Error 69143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 708ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 718ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham Error error; 726475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = m_getopt_table[option_idx].val; 738ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 748ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham switch (short_option) 758ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 768ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham case 'c': 778ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 788ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham bool success; 798ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham int32_t input_count = Args::StringToSInt32 (option_arg, -1, 0, &success); 808ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham if (!success) 819c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid integer value for option '%c'", short_option); 828ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham if (input_count < -1) 838ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_count = UINT32_MAX; 848ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham else 858ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_count = input_count; 868ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 878ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham break; 888ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham case 's': 898ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 908ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham bool success; 918ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_start = Args::StringToUInt32 (option_arg, 0, 0, &success); 928ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham if (!success) 939c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid integer value for option '%c'", short_option); 948ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 958ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham break; 968ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham default: 979c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid short option character '%c'", short_option); 988ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham break; 998ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 1008ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 1018ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham return error; 1028ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 1038ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 1048ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham void 105143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting () 1068ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 107abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton m_count = UINT32_MAX; 1088ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_start = 0; 1098ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 1108ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 111b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 1128ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham GetDefinitions () 1138ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 1148ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham return g_option_table; 1158ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 1168ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 1178ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham // Options table: Required for subclasses of Options. 1188ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 119b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 1208ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 1218ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham // Instance variables to hold the values for command options. 1228ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham uint32_t m_count; 1238ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham uint32_t m_start; 1248ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham }; 1258ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 126238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectThreadBacktrace (CommandInterpreter &interpreter) : 127da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 128ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton "thread backtrace", 129ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton "Show the stack for one or more threads. If no threads are specified, show the currently selected thread. Use the thread-index \"all\" to see all threads.", 130ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton NULL, 131ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresProcess | 132ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresThread | 133ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 134ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 135ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ), 136f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options(interpreter) 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 13943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData thread_idx_arg; 14043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 14143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 14243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_idx_arg.arg_type = eArgTypeThreadIndex; 14343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_idx_arg.arg_repetition = eArgRepeatStar; 14443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 14543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 14643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (thread_idx_arg); 14743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 14843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 14943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadBacktrace() 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1568ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham virtual Options * 1578ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham GetOptions () 1588ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 1598ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham return &m_options; 1608ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 16363094e0bb161580564954dee512955c1c79d3476Greg Clayton virtual bool 164da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 165abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton { 166eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 167abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton Stream &strm = result.GetOutputStream(); 168abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 169abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton // Don't show source context when doing backtraces. 170abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton const uint32_t num_frames_with_source = 0; 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (command.GetArgumentCount() == 0) 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 173ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Thread *thread = m_exe_ctx.GetThreadPtr(); 174ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // Thread::GetStatus() returns the number of frames shown. 175ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (thread->GetStatus (strm, 176ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_options.m_start, 177ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_options.m_count, 178ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton num_frames_with_source)) 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 180ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 183eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham else if (command.GetArgumentCount() == 1 && ::strcmp (command.GetArgumentAtIndex(0), "all") == 0) 184eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 185ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 186b9950593807dad072c9cab77f2b84cb0e8004ffeJim Ingham Mutex::Locker locker (process->GetThreadList().GetMutex()); 187eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham uint32_t num_threads = process->GetThreadList().GetSize(); 188eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham for (uint32_t i = 0; i < num_threads; i++) 189eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 190eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham ThreadSP thread_sp = process->GetThreadList().GetThreadAtIndex(i); 19105750a6bbaa2dc04340278154449c64daa667434Johnny Chen if (!thread_sp->GetStatus (strm, 19205750a6bbaa2dc04340278154449c64daa667434Johnny Chen m_options.m_start, 19305750a6bbaa2dc04340278154449c64daa667434Johnny Chen m_options.m_count, 19405750a6bbaa2dc04340278154449c64daa667434Johnny Chen num_frames_with_source)) 195eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 196f04d661d50bdf32a64f8fc5f84c7fcda72d4cd5aGreg Clayton result.AppendErrorWithFormat ("error displaying backtrace for thread: \"0x%4.4x\"\n", i); 197eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusFailed); 198eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham return false; 199eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 2007868bccbb3cd81451918db8909a20ea93d08f5d4Jim Ingham 2017868bccbb3cd81451918db8909a20ea93d08f5d4Jim Ingham if (i < num_threads - 1) 2027868bccbb3cd81451918db8909a20ea93d08f5d4Jim Ingham result.AppendMessage(""); 2037868bccbb3cd81451918db8909a20ea93d08f5d4Jim Ingham 204eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 205eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_args = command.GetArgumentCount(); 209ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 210b9950593807dad072c9cab77f2b84cb0e8004ffeJim Ingham Mutex::Locker locker (process->GetThreadList().GetMutex()); 211eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham std::vector<ThreadSP> thread_sps; 212eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 21336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t i = 0; i < num_args; i++) 214eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 215eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham bool success; 216eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 217eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham uint32_t thread_idx = Args::StringToUInt32(command.GetArgumentAtIndex(i), 0, 0, &success); 218eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham if (!success) 219eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 220eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendErrorWithFormat ("invalid thread specification: \"%s\"\n", command.GetArgumentAtIndex(i)); 221eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusFailed); 222eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham return false; 223eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 224eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 225eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham thread_sps.push_back(process->GetThreadList().FindThreadByIndexID(thread_idx)); 226eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 227eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham if (!thread_sps[i]) 228eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 229eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendErrorWithFormat ("no thread with index: \"%s\"\n", command.GetArgumentAtIndex(i)); 230eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusFailed); 231eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham return false; 232eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 233eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 234eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 235eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 236eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham for (uint32_t i = 0; i < num_args; i++) 237eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 238abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton if (!thread_sps[i]->GetStatus (strm, 239abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton m_options.m_start, 240abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton m_options.m_count, 241abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton num_frames_with_source)) 242eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 243eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendErrorWithFormat ("error displaying backtrace for thread: \"%s\"\n", command.GetArgumentAtIndex(i)); 244eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusFailed); 245eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham return false; 246eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 247eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 248eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham if (i < num_args - 1) 249eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendMessage(""); 250eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 254da26bd203cbb104291b39891febf7481794f205fJim Ingham 2558ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham CommandOptions m_options; 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 258b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 2598ab1a80624dd2af38fa922538d09f1b37f3ba886Jim InghamCommandObjectThreadBacktrace::CommandOptions::g_option_table[] = 2608ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham{ 2614d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "count", 'c', required_argument, NULL, 0, eArgTypeCount, "How many frames to display (-1 for all)"}, 26243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice{ LLDB_OPT_SET_1, false, "start", 's', required_argument, NULL, 0, eArgTypeFrameIndex, "Frame in which to start the backtrace"}, 2634d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 2648ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham}; 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 266c0418155302e97d37571dfa41a38f6b33759a5e0Greg Claytonenum StepScope 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eStepScopeSource, 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eStepScopeInstruction 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectThreadStepWithTypeAndScope : public CommandObjectParsed 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class CommandOptions : public Options 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 280f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 281f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options (interpreter) 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 283143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton // Keep default values of all options in one place: OptionParsingStarting () 284143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting (); 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandOptions () 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Error 293143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 2966475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = m_getopt_table[option_idx].val; 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (short_option) 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3008d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton case 'a': 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool success; 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_avoid_no_debug = Args::StringToBoolean (option_arg, true, &success); 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!success) 3059c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid boolean value for option '%c'", short_option); 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 3088d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton 3098d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton case 'm': 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner OptionEnumValueElement *enum_values = g_option_table[option_idx].enum_values; 31261aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton m_run_mode = (lldb::RunMode) Args::StringToOptionEnum(option_arg, enum_values, eOnlyDuringStepping, error); 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 3158d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton 3168d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton case 'r': 317809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham { 318809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham m_avoid_regexp.clear(); 319809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham m_avoid_regexp.assign(option_arg); 320809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham } 321809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham break; 3228d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton 323f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham case 't': 324f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham { 325f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham m_step_in_target.clear(); 326f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham m_step_in_target.assign(option_arg); 327f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham 328f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham } 329f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham break; 3308d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton default: 3319c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid short option character '%c'", short_option); 3328d3802d9d6c1be4c0d37c4d269b18bcb865823e6Greg Clayton break; 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 339143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting () 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_avoid_no_debug = true; 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_run_mode = eOnlyDuringStepping; 343809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham m_avoid_regexp.clear(); 344f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham m_step_in_target.clear(); 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 347b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetDefinitions () 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_option_table; 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Options table: Required for subclasses of Options. 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 355b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Instance variables to hold the values for command options. 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_avoid_no_debug; 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RunMode m_run_mode; 360809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham std::string m_avoid_regexp; 361f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham std::string m_step_in_target; 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 364238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectThreadStepWithTypeAndScope (CommandInterpreter &interpreter, 365238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton const char *name, 366238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton const char *help, 367238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton const char *syntax, 368238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton StepType step_type, 369238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton StepScope step_scope) : 370ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton CommandObjectParsed (interpreter, name, help, syntax, 371ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresProcess | 372ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresThread | 373ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 374ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 375ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ), 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_step_type (step_type), 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_step_scope (step_scope), 378f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options (interpreter) 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 38143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData thread_id_arg; 38243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 38343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 38443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_id_arg.arg_type = eArgTypeThreadID; 38543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_id_arg.arg_repetition = eArgRepeatOptional; 38643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 38743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 38843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (thread_id_arg); 38943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 39043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 39143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadStepWithTypeAndScope () 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options * 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetOptions () 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_options; 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 406da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 408da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 410ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 411238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton bool synchronous_execution = m_interpreter.GetSynchronous(); 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 413ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const uint32_t num_threads = process->GetThreadList().GetSize(); 414ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Thread *thread = NULL; 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 416ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (command.GetArgumentCount() == 0) 417ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 418ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton thread = process->GetThreadList().GetSelectedThread().get(); 419ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (thread == NULL) 420ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 421ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("no selected thread in process"); 422ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 423ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton return false; 424ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 428ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const char *thread_idx_cstr = command.GetArgumentAtIndex(0); 429ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton uint32_t step_thread_idx = Args::StringToUInt32 (thread_idx_cstr, LLDB_INVALID_INDEX32); 430ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (step_thread_idx == LLDB_INVALID_INDEX32) 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 432ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendErrorWithFormat ("invalid thread index '%s'.\n", thread_idx_cstr); 433ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 434ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton return false; 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 436ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton thread = process->GetThreadList().FindThreadByIndexID(step_thread_idx).get(); 437ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (thread == NULL) 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 439ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendErrorWithFormat ("Thread index %u is out of range (valid values are 0 - %u).\n", 440ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton step_thread_idx, num_threads); 441ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 442ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton return false; 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 444ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 446ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const bool abort_other_plans = false; 447ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const lldb::RunMode stop_other_threads = m_options.m_run_mode; 448ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 449ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // This is a bit unfortunate, but not all the commands in this command object support 450ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // only while stepping, so I use the bool for them. 451ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool bool_stop_other_threads; 452ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (m_options.m_run_mode == eAllThreads) 453ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool_stop_other_threads = false; 454ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (m_options.m_run_mode == eOnlyDuringStepping) 455ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 456ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (m_step_type == eStepTypeOut) 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool_stop_other_threads = false; 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool_stop_other_threads = true; 460ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 461ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 462ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool_stop_other_threads = true; 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 464ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton ThreadPlan *new_plan = NULL; 465ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 466ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (m_step_type == eStepTypeInto) 467ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 468ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StackFrame *frame = thread->GetStackFrameAtIndex(0).get(); 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 470ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame->HasDebugInformation ()) 471ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 472ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton new_plan = thread->QueueThreadPlanForStepInRange (abort_other_plans, 473ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame->GetSymbolContext(eSymbolContextEverything).line_entry.range, 474ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame->GetSymbolContext(eSymbolContextEverything), 475ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_options.m_step_in_target.c_str(), 476ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton stop_other_threads, 477ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_options.m_avoid_no_debug); 478ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (new_plan && !m_options.m_avoid_regexp.empty()) 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 480ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton ThreadPlanStepInRange *step_in_range_plan = static_cast<ThreadPlanStepInRange *> (new_plan); 481ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton step_in_range_plan->SetAvoidRegexp(m_options.m_avoid_regexp.c_str()); 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 484ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 48588e3de205708f14431559072ca258899b5ac31ccJim Ingham new_plan = thread->QueueThreadPlanForStepSingleInstruction (false, abort_other_plans, bool_stop_other_threads); 486ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 487ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 488ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (m_step_type == eStepTypeOver) 489ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 490ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StackFrame *frame = thread->GetStackFrameAtIndex(0).get(); 491ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 492ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (frame->HasDebugInformation()) 493ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton new_plan = thread->QueueThreadPlanForStepOverRange (abort_other_plans, 494ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame->GetSymbolContext(eSymbolContextEverything).line_entry.range, 495ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton frame->GetSymbolContext(eSymbolContextEverything), 496ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton stop_other_threads); 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 498ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton new_plan = thread->QueueThreadPlanForStepSingleInstruction (true, 499ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton abort_other_plans, 500ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool_stop_other_threads); 50188e3de205708f14431559072ca258899b5ac31ccJim Ingham 502ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 503ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (m_step_type == eStepTypeTrace) 504ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 505ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton new_plan = thread->QueueThreadPlanForStepSingleInstruction (false, abort_other_plans, bool_stop_other_threads); 506ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 507ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (m_step_type == eStepTypeTraceOver) 508ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 509ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton new_plan = thread->QueueThreadPlanForStepSingleInstruction (true, abort_other_plans, bool_stop_other_threads); 510ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 511ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else if (m_step_type == eStepTypeOut) 512ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 513ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton new_plan = thread->QueueThreadPlanForStepOut (abort_other_plans, 514ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton NULL, 515ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton false, 516ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton bool_stop_other_threads, 517ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eVoteYes, 518ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eVoteNoOpinion, 519ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton thread->GetSelectedFrameIndex()); 520ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 521ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 522ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 523ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("step type is not supported"); 524ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 525ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton return false; 526ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 527ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 528ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // If we got a new plan, then set it to be a master plan (User level Plans should be master plans 529ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // so that they can be interruptible). Then resume the process. 530ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 531ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (new_plan != NULL) 532ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 533ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton new_plan->SetIsMasterPlan (true); 534ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton new_plan->SetOkayToDiscard (false); 53588e3de205708f14431559072ca258899b5ac31ccJim Ingham 536ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton process->GetThreadList().SetSelectedThreadByID (thread->GetID()); 537ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton process->Resume (); 538ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 539ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 540ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton if (synchronous_execution) 541ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 542ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StateType state = process->WaitForProcessToStop (NULL); 543ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 544ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton //EventSP event_sp; 545ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton //StateType state = process->WaitForStateChangedEvents (NULL, event_sp); 546ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton //while (! StateIsStoppedState (state)) 547ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // { 548ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // state = process->WaitForStateChangedEvents (NULL, event_sp); 549ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // } 550ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton process->GetThreadList().SetSelectedThreadByID (thread->GetID()); 551ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetDidChangeProcessState (true); 552ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendMessageWithFormat ("Process %" PRIu64 " %s\n", process->GetID(), StateAsCString (state)); 553ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusSuccessFinishNoResult); 55488e3de205708f14431559072ca258899b5ac31ccJim Ingham } 55588e3de205708f14431559072ca258899b5ac31ccJim Ingham else 55688e3de205708f14431559072ca258899b5ac31ccJim Ingham { 557ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusSuccessContinuingNoResult); 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 560ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton else 561ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton { 562ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.AppendError ("Couldn't find thread plan to implement step type."); 563ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton result.SetStatus (eReturnStatusFailed); 564ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton } 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StepType m_step_type; 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StepScope m_step_scope; 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandOptions m_options; 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 574b344843f75ef893762c93fd0a22d2d45712ce74dGreg Claytonstatic OptionEnumValueElement 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerg_tri_running_mode[] = 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 577fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton{ eOnlyThisThread, "this-thread", "Run only this thread"}, 578fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton{ eAllThreads, "all-threads", "Run all threads"}, 579fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton{ eOnlyDuringStepping, "while-stepping", "Run only this thread while stepping"}, 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 0, NULL, NULL } 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 583b344843f75ef893762c93fd0a22d2d45712ce74dGreg Claytonstatic OptionEnumValueElement 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerg_duo_running_mode[] = 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 586fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton{ eOnlyThisThread, "this-thread", "Run only this thread"}, 587fe424a92fc6fd92f810d243912461fe028a2b63cGreg Clayton{ eAllThreads, "all-threads", "Run all threads"}, 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 0, NULL, NULL } 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 591b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectThreadStepWithTypeAndScope::CommandOptions::g_option_table[] = 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5944d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "avoid-no-debug", 'a', required_argument, NULL, 0, eArgTypeBoolean, "A boolean value that sets whether step-in will step over functions with no debug information."}, 5954d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "run-mode", 'm', required_argument, g_tri_running_mode, 0, eArgTypeRunMode, "Determine how to run other threads while stepping the current thread."}, 596f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham{ LLDB_OPT_SET_1, false, "step-over-regexp",'r', required_argument, NULL, 0, eArgTypeRegularExpression, "A regular expression that defines function names to not to stop at when stepping in."}, 597f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham{ LLDB_OPT_SET_1, false, "step-in-target", 't', required_argument, NULL, 0, eArgTypeFunctionName, "The name of the directly called function step in should stop at when stepping into."}, 5984d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadContinue 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 606da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectThreadContinue : public CommandObjectParsed 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 610238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectThreadContinue (CommandInterpreter &interpreter) : 611da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 612da26bd203cbb104291b39891febf7481794f205fJim Ingham "thread continue", 613da26bd203cbb104291b39891febf7481794f205fJim Ingham "Continue execution of one or more threads in an active process.", 614da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 615ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresThread | 616ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 617ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 618ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused) 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 62143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData thread_idx_arg; 62243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 62343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 62443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_idx_arg.arg_type = eArgTypeThreadIndex; 62543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_idx_arg.arg_repetition = eArgRepeatPlus; 62643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 62743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 62843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (thread_idx_arg); 62943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 63043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 63143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadContinue () 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 641da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 643238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton bool synchronous_execution = m_interpreter.GetSynchronous (); 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 645238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton if (!m_interpreter.GetDebugger().GetSelectedTarget().get()) 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 647e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("invalid target, create a debug target using the 'target create' command"); 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 652ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process == NULL) 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("no process exists. Cannot continue"); 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = process->GetState(); 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if ((state == eStateCrashed) || (state == eStateStopped) || (state == eStateSuspended)) 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 663edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton Mutex::Locker locker (process->GetThreadList().GetMutex()); 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t num_threads = process->GetThreadList().GetSize(); 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t argc = command.GetArgumentCount(); 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argc > 0) 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 668edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton std::vector<Thread *> resume_threads; 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<argc; ++i) 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 671d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham bool success; 672d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham const int base = 0; 673edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton uint32_t thread_idx = Args::StringToUInt32 (command.GetArgumentAtIndex(i), LLDB_INVALID_INDEX32, base, &success); 674edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton if (success) 675d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham { 676edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton Thread *thread = process->GetThreadList().FindThreadByIndexID(thread_idx).get(); 677edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton 678edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton if (thread) 679edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton { 680edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton resume_threads.push_back(thread); 681edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton } 682edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton else 683edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton { 684edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton result.AppendErrorWithFormat("invalid thread index %u.\n", thread_idx); 685edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton result.SetStatus (eReturnStatusFailed); 686edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton return false; 687edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton } 688d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham } 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 690d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham { 691edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton result.AppendErrorWithFormat ("invalid thread index argument: \"%s\".\n", command.GetArgumentAtIndex(i)); 692d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham result.SetStatus (eReturnStatusFailed); 693d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham return false; 694d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham } 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 696edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton 697edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton if (resume_threads.empty()) 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("no valid thread indexes were specified"); 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 705edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton if (resume_threads.size() == 1) 706d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham result.AppendMessageWithFormat ("Resuming thread: "); 707d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham else 708d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham result.AppendMessageWithFormat ("Resuming threads: "); 709edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton 710edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton for (uint32_t idx=0; idx<num_threads; ++idx) 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 712edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton Thread *thread = process->GetThreadList().GetThreadAtIndex(idx).get(); 713edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton std::vector<Thread *>::iterator this_thread_pos = find(resume_threads.begin(), resume_threads.end(), thread); 714d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham 715edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton if (this_thread_pos != resume_threads.end()) 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 717edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton resume_threads.erase(this_thread_pos); 718edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton if (resume_threads.size() > 0) 719d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham result.AppendMessageWithFormat ("%u, ", thread->GetIndexID()); 720d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham else 721d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham result.AppendMessageWithFormat ("%u ", thread->GetIndexID()); 722d07b4f534a945209a5bea8f199ea5dbc64874b4bJim Ingham 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->SetResumeState (eStateRunning); 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->SetResumeState (eStateSuspended); 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7305f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat ("in process %" PRIu64 "\n", process->GetID()); 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 735c833295baeec641086f536e78050388af36784f8Jim Ingham Thread *current_thread = process->GetThreadList().GetSelectedThread().get(); 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (current_thread == NULL) 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("the process doesn't have a current thread"); 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set the actions that the threads should each take when resuming 743edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton for (uint32_t idx=0; idx<num_threads; ++idx) 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 745edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton Thread *thread = process->GetThreadList().GetThreadAtIndex(idx).get(); 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread == current_thread) 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7485f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat ("Resuming thread 0x%4.4" PRIx64 " in process %" PRIu64 "\n", thread->GetID(), process->GetID()); 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->SetResumeState (eStateRunning); 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->SetResumeState (eStateSuspended); 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 757edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (process->Resume()); 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7615f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat ("Process %" PRIu64 " resuming\n", process->GetID()); 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (synchronous_execution) 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 764bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton state = process->WaitForProcessToStop (NULL); 765edd601a8a07e9c40c55d67cc6e8a9c9d2e32c2b9Greg Clayton 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetDidChangeProcessState (true); 7675f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat ("Process %" PRIu64 " %s\n", process->GetID(), StateAsCString (state)); 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessContinuingNoResult); 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Failed to resume process: %s\n", error.AsCString()); 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("Process cannot be continued from its current state (%s).\n", 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(state)); 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadUntil 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 797da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectThreadUntil : public CommandObjectParsed 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class CommandOptions : public Options 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t m_thread_idx; 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t m_frame_idx; 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 807f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 808f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options (interpreter), 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_idx(LLDB_INVALID_THREAD_ID), 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_frame_idx(LLDB_INVALID_FRAME_ID) 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 812143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton // Keep default values of all options in one place: OptionParsingStarting () 813143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting (); 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandOptions () 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Error 822143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 8256475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = m_getopt_table[option_idx].val; 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (short_option) 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 't': 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 831bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton m_thread_idx = Args::StringToUInt32 (option_arg, LLDB_INVALID_INDEX32); 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_idx == LLDB_INVALID_INDEX32) 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8349c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("invalid thread index '%s'", option_arg); 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'f': 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_frame_idx = Args::StringToUInt32 (option_arg, LLDB_INVALID_FRAME_ID); 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_frame_idx == LLDB_INVALID_FRAME_ID) 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8439c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat ("invalid frame index '%s'", option_arg); 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'm': 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner OptionEnumValueElement *enum_values = g_option_table[option_idx].enum_values; 85061aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton lldb::RunMode run_mode = (lldb::RunMode) Args::StringToOptionEnum(option_arg, enum_values, eOnlyDuringStepping, error); 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85261aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton if (error.Success()) 85361aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton { 85461aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton if (run_mode == eAllThreads) 85561aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton m_stop_others = false; 85661aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton else 85761aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton m_stop_others = true; 85861aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton } 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 8629c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid short option character '%c'", short_option); 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 870143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting () 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_idx = LLDB_INVALID_THREAD_ID; 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_frame_idx = 0; 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stop_others = false; 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 877b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetDefinitions () 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_option_table; 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t m_step_thread_idx; 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_stop_others; 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Options table: Required for subclasses of Options. 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 888b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Instance variables to hold the values for command options. 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 893238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectThreadUntil (CommandInterpreter &interpreter) : 894da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 895da26bd203cbb104291b39891febf7481794f205fJim Ingham "thread until", 896da26bd203cbb104291b39891febf7481794f205fJim Ingham "Run the current or specified thread until it reaches a given line number or leaves the current function.", 897da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 898ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresThread | 899ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 900ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 901ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ), 902f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options (interpreter) 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 90443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 90543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData line_num_arg; 90643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 90743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 90843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice line_num_arg.arg_type = eArgTypeLineNum; 90943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice line_num_arg.arg_repetition = eArgRepeatPlain; 91043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 91143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 91243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (line_num_arg); 91343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 91443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 91543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadUntil () 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options * 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetOptions () 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_options; 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 931da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 933da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 935238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton bool synchronous_execution = m_interpreter.GetSynchronous (); 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 937238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 938eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton if (target == NULL) 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 940e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton result.AppendError ("invalid target, create a debug target using the 'target create' command"); 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 945ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process == NULL) 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("need a valid process to step"); 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread *thread = NULL; 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t line_number; 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (command.GetArgumentCount() != 1) 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("No line number provided:\n%s", GetSyntax()); 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line_number = Args::StringToUInt32 (command.GetArgumentAtIndex(0), UINT32_MAX); 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (line_number == UINT32_MAX) 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9679c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton result.AppendErrorWithFormat ("invalid line number: '%s'.\n", command.GetArgumentAtIndex(0)); 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_options.m_thread_idx == LLDB_INVALID_THREAD_ID) 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 974c833295baeec641086f536e78050388af36784f8Jim Ingham thread = process->GetThreadList().GetSelectedThread().get(); 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 978a224377015d48e926408fd63b7f9b2d557b91d53Greg Clayton thread = process->GetThreadList().FindThreadByIndexID(m_options.m_thread_idx).get(); 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread == NULL) 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t num_threads = process->GetThreadList().GetSize(); 984b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham result.AppendErrorWithFormat ("Thread index %u is out of range (valid values are 0 - %u).\n", 985b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham m_options.m_thread_idx, 986b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham num_threads); 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 991d82bc6d623930e796d596d190399ec2450980e0fJim Ingham const bool abort_other_plans = false; 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StackFrame *frame = thread->GetStackFrameAtIndex(m_options.m_frame_idx).get(); 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (frame == NULL) 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 997b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham result.AppendErrorWithFormat ("Frame index %u is out of range for thread %u.\n", 998b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham m_options.m_frame_idx, 999b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham m_options.m_thread_idx); 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100488e3de205708f14431559072ca258899b5ac31ccJim Ingham ThreadPlan *new_plan = NULL; 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (frame->HasDebugInformation ()) 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Finally we got here... Translate the given line number to a bunch of addresses: 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc(frame->GetSymbolContext (eSymbolContextCompUnit)); 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LineTable *line_table = NULL; 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit) 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line_table = sc.comp_unit->GetLineTable(); 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (line_table == NULL) 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("Failed to resolve the line table for frame %u of thread index %u.\n", 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_options.m_frame_idx, m_options.m_thread_idx); 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LineEntry function_start; 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t index_ptr = 0, end_ptr; 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<addr_t> address_list; 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Find the beginning & end index of the 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner AddressRange fun_addr_range = sc.function->GetAddressRange(); 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address fun_start_addr = fun_addr_range.GetBaseAddress(); 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line_table->FindLineEntryByAddress (fun_start_addr, function_start, &index_ptr); 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1031b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham Address fun_end_addr(fun_start_addr.GetSection(), 1032b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham fun_start_addr.GetOffset() + fun_addr_range.GetByteSize()); 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line_table->FindLineEntryByAddress (fun_end_addr, function_start, &end_ptr); 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1035b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham bool all_in_function = true; 1036b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (index_ptr <= end_ptr) 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LineEntry line_entry; 1040d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham const bool exact = false; 1041d6d47976b71187907c1cdeea86fabf7d5534314fJim Ingham index_ptr = sc.comp_unit->FindLineEntry(index_ptr, line_number, sc.comp_unit, exact, &line_entry); 104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index_ptr == UINT32_MAX) 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1045eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton addr_t address = line_entry.range.GetBaseAddress().GetLoadAddress(target); 104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (address != LLDB_INVALID_ADDRESS) 1047b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham { 1048b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham if (fun_addr_range.ContainsLoadAddress (address, target)) 1049b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham address_list.push_back (address); 1050b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham else 1051b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham all_in_function = false; 1052b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham } 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner index_ptr++; 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1056b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham if (address_list.size() == 0) 1057b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham { 1058b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham if (all_in_function) 1059b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham result.AppendErrorWithFormat ("No line entries matching until target.\n"); 1060b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham else 1061b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham result.AppendErrorWithFormat ("Until target outside of the current function.\n"); 1062b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham 1063b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham result.SetStatus (eReturnStatusFailed); 1064b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham return false; 1065b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham } 1066b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham 1067b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham new_plan = thread->QueueThreadPlanForStepUntil (abort_other_plans, 1068b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham &address_list.front(), 1069b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham address_list.size(), 1070b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham m_options.m_stop_others, 1071fade78ab4f618cd2921e53e14a7c4db7484d470dJim Ingham m_options.m_frame_idx); 107288e3de205708f14431559072ca258899b5ac31ccJim Ingham // User level plans should be master plans so they can be interrupted (e.g. by hitting a breakpoint) 107388e3de205708f14431559072ca258899b5ac31ccJim Ingham // and other plans executed by the user (stepping around the breakpoint) and then a "continue" 107488e3de205708f14431559072ca258899b5ac31ccJim Ingham // will resume the original plan. 107588e3de205708f14431559072ca258899b5ac31ccJim Ingham new_plan->SetIsMasterPlan (true); 107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new_plan->SetOkayToDiscard(false); 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1080b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham result.AppendErrorWithFormat ("Frame index %u of thread %u has no debug information.\n", 1081b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham m_options.m_frame_idx, 1082b07c62a233f3e54e78154a5718ea18eb51a0bea9Jim Ingham m_options.m_thread_idx); 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1088c833295baeec641086f536e78050388af36784f8Jim Ingham process->GetThreadList().SetSelectedThreadByID (m_options.m_thread_idx); 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (process->Resume ()); 109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10925f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat ("Process %" PRIu64 " resuming\n", process->GetID()); 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (synchronous_execution) 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = process->WaitForProcessToStop (NULL); 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetDidChangeProcessState (true); 10985f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendMessageWithFormat ("Process %" PRIu64 " %s\n", process->GetID(), StateAsCString (state)); 109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessContinuingNoResult); 110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Failed to resume process: %s.\n", error.AsCString()); 110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1115da26bd203cbb104291b39891febf7481794f205fJim Ingham 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandOptions m_options; 111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1120b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectThreadUntil::CommandOptions::g_option_table[] = 112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 112343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice{ LLDB_OPT_SET_1, false, "frame", 'f', required_argument, NULL, 0, eArgTypeFrameIndex, "Frame index for until operation - defaults to 0"}, 11244d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "thread", 't', required_argument, NULL, 0, eArgTypeThreadIndex, "Thread index for the thread for until operation"}, 11254d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "run-mode",'m', required_argument, g_duo_running_mode, 0, eArgTypeRunMode,"Determine how to run other threads while stepping this one"}, 11264d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadSelect 113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1134da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectThreadSelect : public CommandObjectParsed 113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1138238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectThreadSelect (CommandInterpreter &interpreter) : 1139da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 1140da26bd203cbb104291b39891febf7481794f205fJim Ingham "thread select", 1141da26bd203cbb104291b39891febf7481794f205fJim Ingham "Select a thread as the currently active thread.", 1142da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 1143ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresProcess | 1144ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 1145ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 1146ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ) 114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 114843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 114943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData thread_idx_arg; 115043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 115143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 115243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_idx_arg.arg_type = eArgTypeThreadIndex; 115343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice thread_idx_arg.arg_repetition = eArgRepeatPlain; 115443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 115543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 115643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (thread_idx_arg); 115743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 115843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 115943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadSelect () 116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1168da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 1170da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1172ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process == NULL) 117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("no process"); 117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (command.GetArgumentCount() != 1) 118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11817e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda result.AppendErrorWithFormat("'%s' takes exactly one thread index argument:\nUsage: %s\n", m_cmd_name.c_str(), m_cmd_syntax.c_str()); 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t index_id = Args::StringToUInt32(command.GetArgumentAtIndex(0), 0, 0); 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread *new_thread = process->GetThreadList().FindThreadByIndexID(index_id).get(); 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (new_thread == NULL) 119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11919c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton result.AppendErrorWithFormat ("invalid thread #%s.\n", command.GetArgumentAtIndex(0)); 119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11962e2812388b75d3c62c9518cc1a6550ce29325aa6Jim Ingham process->GetThreadList().SetSelectedThreadByID(new_thread->GetID(), true); 11978dbb6e84dd0595ae90656b6146ca19edcb0a54d0Johnny Chen result.SetStatus (eReturnStatusSuccessFinishNoResult); 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadList 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1209da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectThreadList : public CommandObjectParsed 121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 121163094e0bb161580564954dee512955c1c79d3476Greg Claytonpublic: 121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1214238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectThreadList (CommandInterpreter &interpreter): 1215da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 1216da26bd203cbb104291b39891febf7481794f205fJim Ingham "thread list", 1217da26bd203cbb104291b39891febf7481794f205fJim Ingham "Show a summary of all current threads in a process.", 1218da26bd203cbb104291b39891febf7481794f205fJim Ingham "thread list", 1219ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresProcess | 1220ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 1221ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 1222ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ) 122363094e0bb161580564954dee512955c1c79d3476Greg Clayton { 122463094e0bb161580564954dee512955c1c79d3476Greg Clayton } 122563094e0bb161580564954dee512955c1c79d3476Greg Clayton 122663094e0bb161580564954dee512955c1c79d3476Greg Clayton ~CommandObjectThreadList() 122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 122863094e0bb161580564954dee512955c1c79d3476Greg Clayton } 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1230da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 123163094e0bb161580564954dee512955c1c79d3476Greg Clayton bool 1232da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 123363094e0bb161580564954dee512955c1c79d3476Greg Clayton { 12342e8cb8a7342a2ea672792067d712a794e215a3a7Jim Ingham Stream &strm = result.GetOutputStream(); 123563094e0bb161580564954dee512955c1c79d3476Greg Clayton result.SetStatus (eReturnStatusSuccessFinishNoResult); 1236ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 1237ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const bool only_threads_with_stop_reason = false; 1238ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const uint32_t start_frame = 0; 1239ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const uint32_t num_frames = 0; 1240ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton const uint32_t num_frames_with_source = 0; 1241ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton process->GetStatus(strm); 1242ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton process->GetThreadStatus (strm, 1243ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton only_threads_with_stop_reason, 1244ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton start_frame, 1245ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton num_frames, 1246ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton num_frames_with_source); 124763094e0bb161580564954dee512955c1c79d3476Greg Clayton return result.Succeeded(); 124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 124963094e0bb161580564954dee512955c1c79d3476Greg Clayton}; 125024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1251f59388aa57559d7d074613d65b88abacfd699845Jim Inghamclass CommandObjectThreadReturn : public CommandObjectRaw 1252f59388aa57559d7d074613d65b88abacfd699845Jim Ingham{ 1253f59388aa57559d7d074613d65b88abacfd699845Jim Inghampublic: 1254f59388aa57559d7d074613d65b88abacfd699845Jim Ingham CommandObjectThreadReturn (CommandInterpreter &interpreter) : 1255f59388aa57559d7d074613d65b88abacfd699845Jim Ingham CommandObjectRaw (interpreter, 1256f59388aa57559d7d074613d65b88abacfd699845Jim Ingham "thread return", 1257f59388aa57559d7d074613d65b88abacfd699845Jim Ingham "Return from the currently selected frame, short-circuiting execution of the frames below it, with an optional return value.", 1258f59388aa57559d7d074613d65b88abacfd699845Jim Ingham "thread return", 1259ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresFrame | 1260ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagTryTargetAPILock | 1261ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBeLaunched | 1262ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagProcessMustBePaused ) 1263f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1264f59388aa57559d7d074613d65b88abacfd699845Jim Ingham CommandArgumentEntry arg; 1265f59388aa57559d7d074613d65b88abacfd699845Jim Ingham CommandArgumentData expression_arg; 1266f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1267f59388aa57559d7d074613d65b88abacfd699845Jim Ingham // Define the first (and only) variant of this arg. 1268f59388aa57559d7d074613d65b88abacfd699845Jim Ingham expression_arg.arg_type = eArgTypeExpression; 1269f59388aa57559d7d074613d65b88abacfd699845Jim Ingham expression_arg.arg_repetition = eArgRepeatPlain; 1270f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1271f59388aa57559d7d074613d65b88abacfd699845Jim Ingham // There is only one variant this argument could be; put it into the argument entry. 1272f59388aa57559d7d074613d65b88abacfd699845Jim Ingham arg.push_back (expression_arg); 1273f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1274f59388aa57559d7d074613d65b88abacfd699845Jim Ingham // Push the data for the first argument into the m_arguments vector. 1275f59388aa57559d7d074613d65b88abacfd699845Jim Ingham m_arguments.push_back (arg); 1276f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1277f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1278f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1279f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1280f59388aa57559d7d074613d65b88abacfd699845Jim Ingham ~CommandObjectThreadReturn() 1281f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1282f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1283f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1284f59388aa57559d7d074613d65b88abacfd699845Jim Inghamprotected: 1285f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1286f59388aa57559d7d074613d65b88abacfd699845Jim Ingham bool DoExecute 1287f59388aa57559d7d074613d65b88abacfd699845Jim Ingham ( 1288f59388aa57559d7d074613d65b88abacfd699845Jim Ingham const char *command, 1289f59388aa57559d7d074613d65b88abacfd699845Jim Ingham CommandReturnObject &result 1290f59388aa57559d7d074613d65b88abacfd699845Jim Ingham ) 1291f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1292f59388aa57559d7d074613d65b88abacfd699845Jim Ingham ValueObjectSP return_valobj_sp; 1293f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1294ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StackFrameSP frame_sp = m_exe_ctx.GetFrameSP(); 1295f59388aa57559d7d074613d65b88abacfd699845Jim Ingham uint32_t frame_idx = frame_sp->GetFrameIndex(); 1296f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1297f59388aa57559d7d074613d65b88abacfd699845Jim Ingham if (frame_sp->IsInlined()) 1298f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1299f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.AppendError("Don't know how to return from inlined frames."); 1300f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.SetStatus (eReturnStatusFailed); 1301f59388aa57559d7d074613d65b88abacfd699845Jim Ingham return false; 1302f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1303f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1304f59388aa57559d7d074613d65b88abacfd699845Jim Ingham if (command && command[0] != '\0') 1305f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1306ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Target *target = m_exe_ctx.GetTargetPtr(); 130747beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 1308f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1309f59388aa57559d7d074613d65b88abacfd699845Jim Ingham options.SetUnwindOnError(true); 1310f59388aa57559d7d074613d65b88abacfd699845Jim Ingham options.SetUseDynamic(eNoDynamicValues); 1311f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1312f59388aa57559d7d074613d65b88abacfd699845Jim Ingham ExecutionResults exe_results = eExecutionSetupError; 1313f59388aa57559d7d074613d65b88abacfd699845Jim Ingham exe_results = target->EvaluateExpression (command, 1314f59388aa57559d7d074613d65b88abacfd699845Jim Ingham frame_sp.get(), 1315f59388aa57559d7d074613d65b88abacfd699845Jim Ingham return_valobj_sp, 1316f59388aa57559d7d074613d65b88abacfd699845Jim Ingham options); 1317f59388aa57559d7d074613d65b88abacfd699845Jim Ingham if (exe_results != eExecutionCompleted) 1318f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1319f59388aa57559d7d074613d65b88abacfd699845Jim Ingham if (return_valobj_sp) 1320f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.AppendErrorWithFormat("Error evaluating result expression: %s", return_valobj_sp->GetError().AsCString()); 1321f59388aa57559d7d074613d65b88abacfd699845Jim Ingham else 1322f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.AppendErrorWithFormat("Unknown error evaluating result expression."); 1323f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.SetStatus (eReturnStatusFailed); 1324f59388aa57559d7d074613d65b88abacfd699845Jim Ingham return false; 1325f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1326f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1327f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1328f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1329f59388aa57559d7d074613d65b88abacfd699845Jim Ingham Error error; 1330ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton ThreadSP thread_sp = m_exe_ctx.GetThreadSP(); 133194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham const bool broadcast = true; 133294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham error = thread_sp->ReturnFromFrame (frame_sp, return_valobj_sp, broadcast); 1333f59388aa57559d7d074613d65b88abacfd699845Jim Ingham if (!error.Success()) 1334f59388aa57559d7d074613d65b88abacfd699845Jim Ingham { 1335f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.AppendErrorWithFormat("Error returning from frame %d of thread %d: %s.", frame_idx, thread_sp->GetIndexID(), error.AsCString()); 1336f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.SetStatus (eReturnStatusFailed); 1337f59388aa57559d7d074613d65b88abacfd699845Jim Ingham return false; 1338f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1339f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1340f59388aa57559d7d074613d65b88abacfd699845Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 1341f59388aa57559d7d074613d65b88abacfd699845Jim Ingham return true; 1342f59388aa57559d7d074613d65b88abacfd699845Jim Ingham } 1343f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 1344f59388aa57559d7d074613d65b88abacfd699845Jim Ingham}; 1345f59388aa57559d7d074613d65b88abacfd699845Jim Ingham 134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectMultiwordThread 134824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 135063094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectMultiwordThread::CommandObjectMultiwordThread (CommandInterpreter &interpreter) : 1351238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMultiword (interpreter, 1352238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "thread", 1353c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice "A set of commands for operating on one or more threads within a running process.", 135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "thread <subcommand> [<subcommand-options>]") 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1356238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("backtrace", CommandObjectSP (new CommandObjectThreadBacktrace (interpreter))); 1357238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("continue", CommandObjectSP (new CommandObjectThreadContinue (interpreter))); 1358238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("list", CommandObjectSP (new CommandObjectThreadList (interpreter))); 1359f59388aa57559d7d074613d65b88abacfd699845Jim Ingham LoadSubCommand ("return", CommandObjectSP (new CommandObjectThreadReturn (interpreter))); 1360238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("select", CommandObjectSP (new CommandObjectThreadSelect (interpreter))); 1361238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("until", CommandObjectSP (new CommandObjectThreadUntil (interpreter))); 1362238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("step-in", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ( 1363238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton interpreter, 136463094e0bb161580564954dee512955c1c79d3476Greg Clayton "thread step-in", 1365238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Source level single step in specified thread (current thread, if none specified).", 136643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL, 1367238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepTypeInto, 1368238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepScopeSource))); 136963094e0bb161580564954dee512955c1c79d3476Greg Clayton 1370238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("step-out", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ( 1371238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton interpreter, 1372238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "thread step-out", 13731586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham "Finish executing the function of the currently selected frame and return to its call site in specified thread (current thread, if none specified).", 137443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL, 1375238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepTypeOut, 1376238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepScopeSource))); 1377238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton 1378238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("step-over", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ( 1379238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton interpreter, 1380238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "thread step-over", 1381238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Source level single step in specified thread (current thread, if none specified), stepping over calls.", 138243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL, 1383238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepTypeOver, 1384238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepScopeSource))); 1385238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton 1386238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("step-inst", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ( 1387238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton interpreter, 1388238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "thread step-inst", 1389238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Single step one instruction in specified thread (current thread, if none specified).", 139043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL, 1391238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepTypeTrace, 1392238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepScopeInstruction))); 1393238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton 1394238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("step-inst-over", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ( 1395238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton interpreter, 1396238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "thread step-inst-over", 1397238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Single step one instruction in specified thread (current thread, if none specified), stepping over calls.", 139843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL, 1399238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepTypeTraceOver, 1400238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton eStepScopeInstruction))); 140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiwordThread::~CommandObjectMultiwordThread () 140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1408