CommandObjectThread.cpp revision eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbf
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 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectThread.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1684cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Options.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/SourceManager.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepInstruction.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepOut.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepRange.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanStepInRange.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/LineTable.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/LineEntry.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::DisplayThreadInfo 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 4263094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Stream &strm, 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread *thread, 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool only_threads_with_stop_reason, 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool show_source 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread) 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (only_threads_with_stop_reason) 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton if (thread->GetStopInfo() == NULL) 54643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton return false; 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner strm.Indent(); 58c833295baeec641086f536e78050388af36784f8Jim Ingham strm.Printf("%c ", thread->GetProcess().GetThreadList().GetSelectedThread().get() == thread ? '*' : ' '); 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Show one frame with only the first showing source 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (show_source) 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisplayFramesForExecutionContext (thread, 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner interpreter, 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner strm, 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // Start at first frame 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1, // Number of frames to show 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false,// Don't show the frame info since we already displayed most of it above... 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1, // Show source for the first frame 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3, // lines of source context before 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3); // lines of source context after 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->DumpInfo (strm, 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner true, // Dump the stop reason? 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner true, // Dump the thread name? 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner true, // Dump the queue name? 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0); // Display context info for stack frame zero 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner strm.EOL(); 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::DisplayThreadsInfo 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 9263094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ExecutionContext *exe_ctx, 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result, 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool only_threads_with_stop_reason, 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool show_source 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString strm; 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t num_thread_infos_dumped = 0; 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!exe_ctx->process) 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t num_threads = exe_ctx->process->GetThreadList().GetSize(); 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_threads > 0) 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i = 0; i < num_threads; i++) 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread *thread = exe_ctx->process->GetThreadList().GetThreadAtIndex(i).get(); 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread) 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DisplayThreadInfo (interpreter, 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner strm, 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread, 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner only_threads_with_stop_reason, 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner show_source)) 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++num_thread_infos_dumped; 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_thread_infos_dumped > 0) 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_thread_infos_dumped < num_threads) 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.GetOutputStream().Printf("%u of %u threads stopped with reasons:\n", num_thread_infos_dumped, num_threads); 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.GetOutputStream().GetString().append(strm.GetString()); 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_thread_infos_dumped; 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::DisplayFramesForExecutionContext 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread *thread, 14163094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Stream& strm, 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t first_frame, 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_frames, 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool show_frame_info, 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_frames_with_source, 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t source_lines_before, 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t source_lines_after 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread == NULL) 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t num_frames_displayed = 0; 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_frames == 0) 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->DumpInfo (strm, 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner true, // Dump the stop reason? 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner true, // Dump the thread name? 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner true, // Dump the queue name? 16333ed170599d41fe407a4dcf5f0875c75e1ad1375Greg Clayton num_frames > 1 ? UINT32_MAX : first_frame); // Dump info for the first stack frame if we are showing only on frame 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner strm.EOL(); 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner strm.IndentMore(); 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StackFrameSP frame_sp; 16854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint32_t frame_idx = 0; 1698ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham uint32_t last_frame; 1708ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 1718ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham // Don't let the last frame wrap around... 1728ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham if (num_frames == UINT32_MAX) 1738ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham last_frame = UINT32_MAX; 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 1758ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham last_frame = first_frame + num_frames; 1768ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 1778ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham for (frame_idx = first_frame; frame_idx < last_frame; ++frame_idx) 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1798ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham frame_sp = thread->GetStackFrameAtIndex (frame_idx); 1808ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham if (frame_sp.get() == NULL) 1818ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham break; 1828ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 1838ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham if (DisplayFrameForExecutionContext (thread, 1848ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham frame_sp.get(), 1858ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham interpreter, 1868ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham strm, 1878ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham show_frame_info, 1888ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham num_frames_with_source > first_frame - frame_idx, 1898ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham source_lines_before, 1908ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham source_lines_after) == false) 1918ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham break; 1928ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 1938ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham ++num_frames_displayed; 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1958ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner strm.IndentLess(); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return num_frames_displayed; 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::DisplayFrameForExecutionContext 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread *thread, 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StackFrame *frame, 20563094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Stream& strm, 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool show_frame_info, 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool show_source, 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t source_lines_before, 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t source_lines_after 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // thread and frame must be filled in prior to calling this function 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread && frame) 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (show_frame_info) 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner strm.Indent(); 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner frame->Dump (&strm, true); 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner strm.EOL(); 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc (frame->GetSymbolContext(eSymbolContextCompUnit | eSymbolContextLineEntry)); 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (show_source && sc.comp_unit && sc.line_entry.IsValid()) 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22763094e0bb161580564954dee512955c1c79d3476Greg Clayton interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers ( 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.line_entry.file, 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.line_entry.line, 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3, 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3, 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "->", 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner &strm); 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadBacktrace 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectThreadBacktrace : public CommandObject 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2508ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham class CommandOptions : public Options 2518ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 2528ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham public: 2538ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 2548ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham CommandOptions () : 2558ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham Options() 2568ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 2578ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham // Keep default values of all options in one place: ResetOptionValues () 2588ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham ResetOptionValues (); 2598ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 2608ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 2618ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham virtual 2628ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham ~CommandOptions () 2638ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 2648ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 2658ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 2668ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham virtual Error 2678ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham SetOptionValue (int option_idx, const char *option_arg) 2688ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 2698ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham Error error; 2708ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham char short_option = (char) m_getopt_table[option_idx].val; 2718ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 2728ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham switch (short_option) 2738ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 2748ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham case 'c': 2758ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 2768ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham bool success; 2778ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham int32_t input_count = Args::StringToSInt32 (option_arg, -1, 0, &success); 2788ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham if (!success) 2798ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham error.SetErrorStringWithFormat("Invalid integer value for option '%c'.\n", short_option); 2808ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham if (input_count < -1) 2818ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_count = UINT32_MAX; 2828ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham else 2838ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_count = input_count; 2848ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 2858ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham break; 2868ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham case 's': 2878ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 2888ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham bool success; 2898ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_start = Args::StringToUInt32 (option_arg, 0, 0, &success); 2908ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham if (!success) 2918ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham error.SetErrorStringWithFormat("Invalid integer value for option '%c'.\n", short_option); 2928ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 2938ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham break; 2948ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham default: 2958ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham error.SetErrorStringWithFormat("Invalid short option character '%c'.\n", short_option); 2968ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham break; 2978ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 2988ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 2998ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham return error; 3008ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 3018ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 3028ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham void 3038ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham ResetOptionValues () 3048ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 3058ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham Options::ResetOptionValues(); 3068ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_count = -1; 3078ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_start = 0; 3088ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 3098ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 3108ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham const lldb::OptionDefinition* 3118ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham GetDefinitions () 3128ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 3138ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham return g_option_table; 3148ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 3158ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 3168ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham // Options table: Required for subclasses of Options. 3178ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 3188ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham static lldb::OptionDefinition g_option_table[]; 3198ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 3208ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham // Instance variables to hold the values for command options. 3218ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham uint32_t m_count; 3228ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham uint32_t m_start; 3238ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham }; 3248ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObjectThreadBacktrace () : 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObject ("thread backtrace", 327eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham "Shows the stack for one or more threads. If no threads are specified, shows the currently selected thread. \nUse the thread-index \"all\" to see all threads.", 328eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham "thread backtrace [<thread-index>] ...", 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eFlagProcessMustBeLaunched | eFlagProcessMustBePaused), 3308ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_options() 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadBacktrace() 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3388ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham virtual Options * 3398ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham GetOptions () 3408ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham { 3418ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham return &m_options; 3428ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham } 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34463094e0bb161580564954dee512955c1c79d3476Greg Clayton virtual bool 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Execute 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ( 34763094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Args& command, 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ) 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 352eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 353eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham bool show_frame_info = true; 354eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham uint32_t num_frames_with_source = 0; // Don't show any frames with source when backtracing 355eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 356eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 357eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (command.GetArgumentCount() == 0) 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36063094e0bb161580564954dee512955c1c79d3476Greg Clayton ExecutionContext exe_ctx(interpreter.GetDebugger().GetExecutionContext()); 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_ctx.thread) 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DisplayFramesForExecutionContext (exe_ctx.thread, 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner interpreter, 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.GetOutputStream(), 3668ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_options.m_start, 3678ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham m_options.m_count, 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner show_frame_info, 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner num_frames_with_source, 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3, 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3)) 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishResult); 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("invalid thread"); 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 382eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham else if (command.GetArgumentCount() == 1 && ::strcmp (command.GetArgumentAtIndex(0), "all") == 0) 383eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 384eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham Process *process = interpreter.GetDebugger().GetExecutionContext().process; 385eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham uint32_t num_threads = process->GetThreadList().GetSize(); 386eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham for (uint32_t i = 0; i < num_threads; i++) 387eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 388eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham ThreadSP thread_sp = process->GetThreadList().GetThreadAtIndex(i); 389eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham if (!DisplayFramesForExecutionContext (thread_sp.get(), 390eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham interpreter, 391eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.GetOutputStream(), 392eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham m_options.m_start, 393eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham m_options.m_count, 394eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham show_frame_info, 395eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham num_frames_with_source, 396eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 3, 397eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 3)) 398eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 399eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendErrorWithFormat ("error displaying backtrace for thread: \"%d\"\n", i); 400eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusFailed); 401eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham return false; 402eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 403eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham if (i < num_threads - 1) 404eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendMessage(""); 405eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 406eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 409eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham uint32_t num_args = command.GetArgumentCount(); 410eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham Process *process = interpreter.GetDebugger().GetExecutionContext().process; 411eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham std::vector<ThreadSP> thread_sps; 412eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 413eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham for (uint32_t i = 0; i < num_args; i++) 414eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 415eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham bool success; 416eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 417eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham uint32_t thread_idx = Args::StringToUInt32(command.GetArgumentAtIndex(i), 0, 0, &success); 418eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham if (!success) 419eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 420eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendErrorWithFormat ("invalid thread specification: \"%s\"\n", command.GetArgumentAtIndex(i)); 421eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusFailed); 422eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham return false; 423eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 424eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 425eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham thread_sps.push_back(process->GetThreadList().FindThreadByIndexID(thread_idx)); 426eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 427eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham if (!thread_sps[i]) 428eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 429eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendErrorWithFormat ("no thread with index: \"%s\"\n", command.GetArgumentAtIndex(i)); 430eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusFailed); 431eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham return false; 432eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 433eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 434eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 435eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 436eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham for (uint32_t i = 0; i < num_args; i++) 437eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 438eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham if (!DisplayFramesForExecutionContext (thread_sps[i].get(), 439eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham interpreter, 440eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.GetOutputStream(), 441eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham m_options.m_start, 442eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham m_options.m_count, 443eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham show_frame_info, 444eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham num_frames_with_source, 445eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 3, 446eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 3)) 447eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham { 448eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendErrorWithFormat ("error displaying backtrace for thread: \"%s\"\n", command.GetArgumentAtIndex(i)); 449eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.SetStatus (eReturnStatusFailed); 450eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham return false; 451eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 452eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham 453eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham if (i < num_args - 1) 454eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham result.AppendMessage(""); 455eb10f7bb0a1edf2fac44fe42c4005cfa4cbc8cbfJim Ingham } 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 4608ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham CommandOptions m_options; 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4638ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Inghamlldb::OptionDefinition 4648ab1a80624dd2af38fa922538d09f1b37f3ba886Jim InghamCommandObjectThreadBacktrace::CommandOptions::g_option_table[] = 4658ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham{ 4668ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham{ LLDB_OPT_SET_1, false, "count", 'c', required_argument, NULL, 0, "<count>", "How many frames to display (-1 for all)"}, 4678ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham{ LLDB_OPT_SET_1, false, "start", 's', required_argument, NULL, 0, "<start>", "Where to start the backtrace"}, 4688ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham{ 0, false, NULL, 0, 0, NULL, 0, NULL, NULL } 4698ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham}; 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 471c0418155302e97d37571dfa41a38f6b33759a5e0Greg Claytonenum StepScope 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eStepScopeSource, 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eStepScopeInstruction 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectThreadStepWithTypeAndScope : public CommandObject 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class CommandOptions : public Options 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandOptions () : 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options() 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Keep default values of all options in one place: ResetOptionValues () 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ResetOptionValues (); 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandOptions () 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Error 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetOptionValue (int option_idx, const char *option_arg) 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char short_option = (char) m_getopt_table[option_idx].val; 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (short_option) 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'a': 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool success; 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_avoid_no_debug = Args::StringToBoolean (option_arg, true, &success); 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!success) 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("Invalid boolean value for option '%c'.\n", short_option); 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'm': 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool found_one = false; 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner OptionEnumValueElement *enum_values = g_option_table[option_idx].enum_values; 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_run_mode = (lldb::RunMode) Args::StringToOptionEnum(option_arg, enum_values, eOnlyDuringStepping, &found_one); 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!found_one) 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("Invalid enumeration value for option '%c'.\n", short_option); 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 522809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham case 'r': 523809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham { 524809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham m_avoid_regexp.clear(); 525809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham m_avoid_regexp.assign(option_arg); 526809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham } 527809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham break; 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("Invalid short option character '%c'.\n", short_option); 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ResetOptionValues () 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options::ResetOptionValues(); 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_avoid_no_debug = true; 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_run_mode = eOnlyDuringStepping; 542809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham m_avoid_regexp.clear(); 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb::OptionDefinition* 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetDefinitions () 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_option_table; 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Options table: Required for subclasses of Options. 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static lldb::OptionDefinition g_option_table[]; 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Instance variables to hold the values for command options. 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_avoid_no_debug; 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RunMode m_run_mode; 558809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham std::string m_avoid_regexp; 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObjectThreadStepWithTypeAndScope (const char *name, 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *help, 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *syntax, 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t flags, 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StepType step_type, 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StepScope step_scope) : 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObject (name, help, syntax, flags), 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_step_type (step_type), 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_step_scope (step_scope), 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_options () 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadStepWithTypeAndScope () 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options * 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetOptions () 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_options; 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 58763094e0bb161580564954dee512955c1c79d3476Greg Clayton Execute 58863094e0bb161580564954dee512955c1c79d3476Greg Clayton ( 58963094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 59063094e0bb161580564954dee512955c1c79d3476Greg Clayton Args& command, 59163094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandReturnObject &result 59263094e0bb161580564954dee512955c1c79d3476Greg Clayton ) 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 59463094e0bb161580564954dee512955c1c79d3476Greg Clayton Process *process = interpreter.GetDebugger().GetExecutionContext().process; 59563094e0bb161580564954dee512955c1c79d3476Greg Clayton bool synchronous_execution = interpreter.GetSynchronous(); 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process == NULL) 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("need a valid process to step"); 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t num_threads = process->GetThreadList().GetSize(); 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread *thread = NULL; 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (command.GetArgumentCount() == 0) 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 610c833295baeec641086f536e78050388af36784f8Jim Ingham thread = process->GetThreadList().GetSelectedThread().get(); 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread == NULL) 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6138ab1a80624dd2af38fa922538d09f1b37f3ba886Jim Ingham result.AppendError ("no selected thread in process"); 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *thread_idx_cstr = command.GetArgumentAtIndex(0); 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t step_thread_idx = Args::StringToUInt32 (thread_idx_cstr, LLDB_INVALID_INDEX32); 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (step_thread_idx == LLDB_INVALID_INDEX32) 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("Invalid thread index '%s'.\n", thread_idx_cstr); 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread = process->GetThreadList().FindThreadByIndexID(step_thread_idx).get(); 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread == NULL) 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("Thread index %u is out of range (valid values are 0 - %u).\n", 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner step_thread_idx, 0, num_threads); 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const bool abort_other_plans = false; 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb::RunMode stop_other_threads = m_options.m_run_mode; 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This is a bit unfortunate, but not all the commands in this command object support 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // only while stepping, so I use the bool for them. 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool bool_stop_other_threads; 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_options.m_run_mode == eAllThreads) 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool_stop_other_threads = false; 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool_stop_other_threads = true; 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_step_type == eStepTypeInto) 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StackFrame *frame = thread->GetStackFrameAtIndex(0).get(); 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan *new_plan; 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (frame->HasDebugInformation ()) 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new_plan = thread->QueueThreadPlanForStepRange (abort_other_plans, m_step_type, 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner frame->GetSymbolContext(eSymbolContextEverything).line_entry.range, 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner frame->GetSymbolContext(eSymbolContextEverything), 6598f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton stop_other_threads, 6608f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton m_options.m_avoid_no_debug); 661809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham if (new_plan && !m_options.m_avoid_regexp.empty()) 662809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham { 663809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham ThreadPlanStepInRange *step_in_range_plan = static_cast<ThreadPlanStepInRange *> (new_plan); 664809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham step_in_range_plan->SetAvoidRegexp(m_options.m_avoid_regexp.c_str()); 665809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham } 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new_plan = thread->QueueThreadPlanForStepSingleInstruction (false, abort_other_plans, bool_stop_other_threads); 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 670c833295baeec641086f536e78050388af36784f8Jim Ingham process->GetThreadList().SetSelectedThreadByID (thread->GetID()); 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process->Resume (); 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (m_step_type == eStepTypeOver) 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StackFrame *frame = thread->GetStackFrameAtIndex(0).get(); 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan *new_plan; 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (frame->HasDebugInformation()) 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new_plan = thread->QueueThreadPlanForStepRange (abort_other_plans, 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_step_type, 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner frame->GetSymbolContext(eSymbolContextEverything).line_entry.range, 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner frame->GetSymbolContext(eSymbolContextEverything), 6838f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton stop_other_threads, 6848f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton false); 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new_plan = thread->QueueThreadPlanForStepSingleInstruction (true, 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner abort_other_plans, 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool_stop_other_threads); 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: This will keep the step plan on the thread stack when we hit a breakpoint while stepping over. 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Maybe there should be a parameter to control this. 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new_plan->SetOkayToDiscard(false); 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 694c833295baeec641086f536e78050388af36784f8Jim Ingham process->GetThreadList().SetSelectedThreadByID (thread->GetID()); 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process->Resume (); 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (m_step_type == eStepTypeTrace) 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->QueueThreadPlanForStepSingleInstruction (false, abort_other_plans, bool_stop_other_threads); 700c833295baeec641086f536e78050388af36784f8Jim Ingham process->GetThreadList().SetSelectedThreadByID (thread->GetID()); 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process->Resume (); 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (m_step_type == eStepTypeTraceOver) 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->QueueThreadPlanForStepSingleInstruction (true, abort_other_plans, bool_stop_other_threads); 706c833295baeec641086f536e78050388af36784f8Jim Ingham process->GetThreadList().SetSelectedThreadByID (thread->GetID()); 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process->Resume (); 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (m_step_type == eStepTypeOut) 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan *new_plan; 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new_plan = thread->QueueThreadPlanForStepOut (abort_other_plans, NULL, false, bool_stop_other_threads, eVoteYes, eVoteNoOpinion); 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: This will keep the step plan on the thread stack when we hit a breakpoint while stepping over. 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Maybe there should be a parameter to control this. 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new_plan->SetOkayToDiscard(false); 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 718c833295baeec641086f536e78050388af36784f8Jim Ingham process->GetThreadList().SetSelectedThreadByID (thread->GetID()); 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner process->Resume (); 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("step type is not supported"); 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (synchronous_execution) 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = process->WaitForProcessToStop (NULL); 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //EventSP event_sp; 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //StateType state = process->WaitForStateChangedEvents (NULL, event_sp); 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //while (! StateIsStoppedState (state)) 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // { 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // state = process->WaitForStateChangedEvents (NULL, event_sp); 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // } 736c833295baeec641086f536e78050388af36784f8Jim Ingham process->GetThreadList().SetSelectedThreadByID (thread->GetID()); 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetDidChangeProcessState (true); 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendMessageWithFormat ("Process %i %s\n", process->GetID(), StateAsCString (state)); 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StepType m_step_type; 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StepScope m_step_scope; 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandOptions m_options; 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::OptionEnumValueElement 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerg_tri_running_mode[] = 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ eOnlyThisThread, "thisThread", "Run only this thread"}, 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ eAllThreads, "allThreads", "Run all threads"}, 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ eOnlyDuringStepping, "whileStepping", "Run only this thread while stepping"}, 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 0, NULL, NULL } 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic lldb::OptionEnumValueElement 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerg_duo_running_mode[] = 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ eOnlyThisThread, "thisThread", "Run only this thread"}, 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ eAllThreads, "allThreads", "Run all threads"}, 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 0, NULL, NULL } 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::OptionDefinition 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectThreadStepWithTypeAndScope::CommandOptions::g_option_table[] = 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 77112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{ LLDB_OPT_SET_1, false, "avoid_no_debug", 'a', required_argument, NULL, 0, "<avoid_no_debug>", "Should step-in step over functions with no debug information"}, 77212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{ LLDB_OPT_SET_1, false, "run_mode", 'm', required_argument, g_tri_running_mode, 0, "<run_mode>", "Determine how to run other threads while stepping this one"}, 773809ab9bcd5eb7aa87fb662a89a327384f892b923Jim Ingham{ LLDB_OPT_SET_1, false, "regexp_to_avoid",'r', required_argument, NULL, 0, "<avoid_regexp>", "Should step-in step over functions matching this regexp"}, 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 0, false, NULL, 0, 0, NULL, 0, NULL, NULL } 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadContinue 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectThreadContinue : public CommandObject 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObjectThreadContinue () : 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObject ("thread continue", 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Continues execution of one or more threads in an active process.", 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "thread continue <thread-index> [<thread-index> ...]", 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eFlagProcessMustBeLaunched | eFlagProcessMustBePaused) 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadContinue () 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 80163094e0bb161580564954dee512955c1c79d3476Greg Clayton Execute 80263094e0bb161580564954dee512955c1c79d3476Greg Clayton ( 80363094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 80463094e0bb161580564954dee512955c1c79d3476Greg Clayton Args& command, 80563094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandReturnObject &result 80663094e0bb161580564954dee512955c1c79d3476Greg Clayton ) 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 80863094e0bb161580564954dee512955c1c79d3476Greg Clayton bool synchronous_execution = interpreter.GetSynchronous (); 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 810c833295baeec641086f536e78050388af36784f8Jim Ingham if (!interpreter.GetDebugger().GetSelectedTarget().get()) 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("invalid target, set executable file using 'file' command"); 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81763094e0bb161580564954dee512955c1c79d3476Greg Clayton Process *process = interpreter.GetDebugger().GetExecutionContext().process; 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process == NULL) 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("no process exists. Cannot continue"); 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = process->GetState(); 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if ((state == eStateCrashed) || (state == eStateStopped) || (state == eStateSuspended)) 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t num_threads = process->GetThreadList().GetSize(); 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx; 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t argc = command.GetArgumentCount(); 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argc > 0) 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> resume_thread_indexes; 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<argc; ++i) 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner idx = Args::StringToUInt32 (command.GetArgumentAtIndex(0), LLDB_INVALID_INDEX32); 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (idx < num_threads) 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resume_thread_indexes.push_back(idx); 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendWarningWithFormat("Thread index %u out of range.\n", idx); 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (resume_thread_indexes.empty()) 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("no valid thread indexes were specified"); 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendMessage ("Resuming thread "); 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx=0; idx<num_threads; ++idx) 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread *thread = process->GetThreadList().GetThreadAtIndex(idx).get(); 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (find(resume_thread_indexes.begin(), resume_thread_indexes.end(), idx) != resume_thread_indexes.end()) 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendMessageWithFormat ("%u ", idx); 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->SetResumeState (eStateRunning); 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->SetResumeState (eStateSuspended); 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendMessageWithFormat ("in process %i\n", process->GetID()); 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 870c833295baeec641086f536e78050388af36784f8Jim Ingham Thread *current_thread = process->GetThreadList().GetSelectedThread().get(); 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (current_thread == NULL) 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("the process doesn't have a current thread"); 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set the actions that the threads should each take when resuming 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (idx=0; idx<num_threads; ++idx) 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread *thread = process->GetThreadList().GetThreadAtIndex(idx).get(); 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread == current_thread) 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendMessageWithFormat ("Resuming thread 0x%4.4x in process %i\n", thread->GetID(), process->GetID()); 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->SetResumeState (eStateRunning); 88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread->SetResumeState (eStateSuspended); 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (process->Resume()); 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendMessageWithFormat ("Resuming process %i\n", process->GetID()); 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (synchronous_execution) 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 899bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton state = process->WaitForProcessToStop (NULL); 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetDidChangeProcessState (true); 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendMessageWithFormat ("Process %i %s\n", process->GetID(), StateAsCString (state)); 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessContinuingNoResult); 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Failed to resume process: %s\n", error.AsCString()); 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("Process cannot be continued from its current state (%s).\n", 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateAsCString(state)); 92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadUntil 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectThreadUntil : public CommandObject 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class CommandOptions : public Options 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t m_thread_idx; 94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t m_frame_idx; 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandOptions () : 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options(), 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_idx(LLDB_INVALID_THREAD_ID), 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_frame_idx(LLDB_INVALID_FRAME_ID) 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Keep default values of all options in one place: ResetOptionValues () 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ResetOptionValues (); 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandOptions () 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Error 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetOptionValue (int option_idx, const char *option_arg) 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char short_option = (char) m_getopt_table[option_idx].val; 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (short_option) 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 't': 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 966bef1583b89e73de77c8b0897fcf42b5b1fcabe4cGreg Clayton m_thread_idx = Args::StringToUInt32 (option_arg, LLDB_INVALID_INDEX32); 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread_idx == LLDB_INVALID_INDEX32) 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat ("Invalid thread index '%s'.\n", option_arg); 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'f': 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_frame_idx = Args::StringToUInt32 (option_arg, LLDB_INVALID_FRAME_ID); 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_frame_idx == LLDB_INVALID_FRAME_ID) 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat ("Invalid frame index '%s'.\n", option_arg); 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'm': 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool found_one = false; 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner OptionEnumValueElement *enum_values = g_option_table[option_idx].enum_values; 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::RunMode run_mode = (lldb::RunMode) Args::StringToOptionEnum(option_arg, enum_values, eOnlyDuringStepping, &found_one); 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!found_one) 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("Invalid enumeration value for option '%c'.\n", short_option); 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (run_mode == eAllThreads) 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stop_others = false; 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stop_others = true; 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorStringWithFormat("Invalid short option character '%c'.\n", short_option); 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ResetOptionValues () 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options::ResetOptionValues(); 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread_idx = LLDB_INVALID_THREAD_ID; 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_frame_idx = 0; 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stop_others = false; 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb::OptionDefinition* 101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetDefinitions () 101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_option_table; 101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t m_step_thread_idx; 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_stop_others; 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Options table: Required for subclasses of Options. 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static lldb::OptionDefinition g_option_table[]; 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Instance variables to hold the values for command options. 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObjectThreadUntil () : 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObject ("thread until", 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Runs the current or specified thread until it reaches a given line number or leaves the current function.", 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "thread until [<cmd-options>] <line-number>", 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eFlagProcessMustBeLaunched | eFlagProcessMustBePaused), 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_options () 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadUntil () 104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options * 104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetOptions () 104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_options; 105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 105363094e0bb161580564954dee512955c1c79d3476Greg Clayton Execute 105463094e0bb161580564954dee512955c1c79d3476Greg Clayton ( 105563094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 105663094e0bb161580564954dee512955c1c79d3476Greg Clayton Args& command, 105763094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandReturnObject &result 105863094e0bb161580564954dee512955c1c79d3476Greg Clayton ) 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 106063094e0bb161580564954dee512955c1c79d3476Greg Clayton bool synchronous_execution = interpreter.GetSynchronous (); 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1062c833295baeec641086f536e78050388af36784f8Jim Ingham if (!interpreter.GetDebugger().GetSelectedTarget().get()) 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("invalid target, set executable file using 'file' command"); 106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106963094e0bb161580564954dee512955c1c79d3476Greg Clayton Process *process = interpreter.GetDebugger().GetExecutionContext().process; 107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process == NULL) 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("need a valid process to step"); 107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread *thread = NULL; 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t line_number; 108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (command.GetArgumentCount() != 1) 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("No line number provided:\n%s", GetSyntax()); 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line_number = Args::StringToUInt32 (command.GetArgumentAtIndex(0), UINT32_MAX); 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (line_number == UINT32_MAX) 109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("Invalid line number: '%s'.\n", command.GetArgumentAtIndex(0)); 109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_options.m_thread_idx == LLDB_INVALID_THREAD_ID) 109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1098c833295baeec641086f536e78050388af36784f8Jim Ingham thread = process->GetThreadList().GetSelectedThread().get(); 109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread = process->GetThreadList().GetThreadAtIndex(m_options.m_thread_idx).get(); 110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (thread == NULL) 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t num_threads = process->GetThreadList().GetSize(); 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("Thread index %u is out of range (valid values are 0 - %u).\n", m_options.m_thread_idx, 0, num_threads); 110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const bool abort_other_plans = true; 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StackFrame *frame = thread->GetStackFrameAtIndex(m_options.m_frame_idx).get(); 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (frame == NULL) 111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("Frame index %u is out of range for thread %u.\n", m_options.m_frame_idx, m_options.m_thread_idx); 112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan *new_plan; 112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (frame->HasDebugInformation ()) 112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Finally we got here... Translate the given line number to a bunch of addresses: 112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc(frame->GetSymbolContext (eSymbolContextCompUnit)); 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LineTable *line_table = NULL; 113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit) 113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line_table = sc.comp_unit->GetLineTable(); 113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (line_table == NULL) 113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("Failed to resolve the line table for frame %u of thread index %u.\n", 113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_options.m_frame_idx, m_options.m_thread_idx); 113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LineEntry function_start; 114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t index_ptr = 0, end_ptr; 114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<addr_t> address_list; 114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Find the beginning & end index of the 114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner AddressRange fun_addr_range = sc.function->GetAddressRange(); 114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address fun_start_addr = fun_addr_range.GetBaseAddress(); 114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line_table->FindLineEntryByAddress (fun_start_addr, function_start, &index_ptr); 115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address fun_end_addr(fun_start_addr.GetSection(), fun_start_addr.GetOffset() + fun_addr_range.GetByteSize()); 115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line_table->FindLineEntryByAddress (fun_end_addr, function_start, &end_ptr); 115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (index_ptr <= end_ptr) 115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner LineEntry line_entry; 115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner index_ptr = sc.comp_unit->FindLineEntry(index_ptr, line_number, sc.comp_unit, &line_entry); 115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index_ptr == UINT32_MAX) 115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr_t address = line_entry.range.GetBaseAddress().GetLoadAddress(process); 116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (address != LLDB_INVALID_ADDRESS) 116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner address_list.push_back (address); 116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner index_ptr++; 116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 116753d68e749f0715691a95f23e9490d97e484b15daGreg Clayton new_plan = thread->QueueThreadPlanForStepUntil (abort_other_plans, &address_list.front(), address_list.size(), m_options.m_stop_others); 116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new_plan->SetOkayToDiscard(false); 116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("Frame index %u of thread %u has no debug information.\n", m_options.m_frame_idx, m_options.m_thread_idx); 117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1178c833295baeec641086f536e78050388af36784f8Jim Ingham process->GetThreadList().SetSelectedThreadByID (m_options.m_thread_idx); 117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error (process->Resume ()); 118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (error.Success()) 118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendMessageWithFormat ("Resuming process %i\n", process->GetID()); 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (synchronous_execution) 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StateType state = process->WaitForProcessToStop (NULL); 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetDidChangeProcessState (true); 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendMessageWithFormat ("Process %i %s\n", process->GetID(), StateAsCString (state)); 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessContinuingNoResult); 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("Failed to resume process: %s.\n", error.AsCString()); 119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandOptions m_options; 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb::OptionDefinition 121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectThreadUntil::CommandOptions::g_option_table[] = 121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 121312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{ LLDB_OPT_SET_1, false, "frame", 'f', required_argument, NULL, 0, "<frame>", "Frame index for until operation - defaults to 0"}, 121412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{ LLDB_OPT_SET_1, false, "thread", 't', required_argument, NULL, 0, "<thread>", "Thread index for the thread for until operation"}, 121512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton{ LLDB_OPT_SET_1, false, "run_mode",'m', required_argument, g_duo_running_mode, 0, "<run_mode>","Determine how to run other threads while stepping this one"}, 121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 0, false, NULL, 0, 0, NULL, 0, NULL, NULL } 121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadSelect 122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandObjectThreadSelect : public CommandObject 122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObjectThreadSelect () : 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObject ("thread select", 123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Selects a threads as the currently active thread.", 123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "thread select <thread-index>", 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eFlagProcessMustBeLaunched | eFlagProcessMustBePaused) 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectThreadSelect () 123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 124363094e0bb161580564954dee512955c1c79d3476Greg Clayton Execute 124463094e0bb161580564954dee512955c1c79d3476Greg Clayton ( 124563094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 124663094e0bb161580564954dee512955c1c79d3476Greg Clayton Args& command, 124763094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandReturnObject &result 124863094e0bb161580564954dee512955c1c79d3476Greg Clayton ) 124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 125063094e0bb161580564954dee512955c1c79d3476Greg Clayton Process *process = interpreter.GetDebugger().GetExecutionContext().process; 125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process == NULL) 125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError ("no process"); 125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (command.GetArgumentCount() != 1) 125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat("'%s' takes exactly one thread index argument:\nUsage: \n", m_cmd_name.c_str(), m_cmd_syntax.c_str()); 126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t index_id = Args::StringToUInt32(command.GetArgumentAtIndex(0), 0, 0); 126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread *new_thread = process->GetThreadList().FindThreadByIndexID(index_id).get(); 126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (new_thread == NULL) 126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("Invalid thread #%s.\n", command.GetArgumentAtIndex(0)); 127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1274c833295baeec641086f536e78050388af36784f8Jim Ingham process->GetThreadList().SetSelectedThreadByID(new_thread->GetID()); 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DisplayThreadInfo (interpreter, 127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.GetOutputStream(), 127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner new_thread, 127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false, 128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner true); 128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectThreadList 129024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129263094e0bb161580564954dee512955c1c79d3476Greg Claytonclass CommandObjectThreadList : public CommandObject 129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 129463094e0bb161580564954dee512955c1c79d3476Greg Claytonpublic: 129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129763094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandObjectThreadList (): 129863094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandObject ("thread list", 129963094e0bb161580564954dee512955c1c79d3476Greg Clayton "Shows a summary of all current threads in a process.", 130063094e0bb161580564954dee512955c1c79d3476Greg Clayton "thread list", 130163094e0bb161580564954dee512955c1c79d3476Greg Clayton eFlagProcessMustBeLaunched | eFlagProcessMustBePaused) 130263094e0bb161580564954dee512955c1c79d3476Greg Clayton { 130363094e0bb161580564954dee512955c1c79d3476Greg Clayton } 130463094e0bb161580564954dee512955c1c79d3476Greg Clayton 130563094e0bb161580564954dee512955c1c79d3476Greg Clayton ~CommandObjectThreadList() 130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 130763094e0bb161580564954dee512955c1c79d3476Greg Clayton } 130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 130963094e0bb161580564954dee512955c1c79d3476Greg Clayton bool 131063094e0bb161580564954dee512955c1c79d3476Greg Clayton Execute 131163094e0bb161580564954dee512955c1c79d3476Greg Clayton ( 131263094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 131363094e0bb161580564954dee512955c1c79d3476Greg Clayton Args& command, 131463094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandReturnObject &result 131563094e0bb161580564954dee512955c1c79d3476Greg Clayton ) 131663094e0bb161580564954dee512955c1c79d3476Greg Clayton { 131763094e0bb161580564954dee512955c1c79d3476Greg Clayton StreamString &strm = result.GetOutputStream(); 131863094e0bb161580564954dee512955c1c79d3476Greg Clayton result.SetStatus (eReturnStatusSuccessFinishNoResult); 131963094e0bb161580564954dee512955c1c79d3476Greg Clayton ExecutionContext exe_ctx(interpreter.GetDebugger().GetExecutionContext()); 132063094e0bb161580564954dee512955c1c79d3476Greg Clayton if (exe_ctx.process) 132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 132263094e0bb161580564954dee512955c1c79d3476Greg Clayton const StateType state = exe_ctx.process->GetState(); 132363094e0bb161580564954dee512955c1c79d3476Greg Clayton 132463094e0bb161580564954dee512955c1c79d3476Greg Clayton if (StateIsStoppedState(state)) 132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 132663094e0bb161580564954dee512955c1c79d3476Greg Clayton if (state == eStateExited) 132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 132863094e0bb161580564954dee512955c1c79d3476Greg Clayton int exit_status = exe_ctx.process->GetExitStatus(); 132963094e0bb161580564954dee512955c1c79d3476Greg Clayton const char *exit_description = exe_ctx.process->GetExitDescription(); 133063094e0bb161580564954dee512955c1c79d3476Greg Clayton strm.Printf ("Process %d exited with status = %i (0x%8.8x) %s\n", 133163094e0bb161580564954dee512955c1c79d3476Greg Clayton exe_ctx.process->GetID(), 133263094e0bb161580564954dee512955c1c79d3476Greg Clayton exit_status, 133363094e0bb161580564954dee512955c1c79d3476Greg Clayton exit_status, 133463094e0bb161580564954dee512955c1c79d3476Greg Clayton exit_description ? exit_description : ""); 133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 133624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 133863094e0bb161580564954dee512955c1c79d3476Greg Clayton strm.Printf ("Process %d state is %s\n", exe_ctx.process->GetID(), StateAsCString (state)); 133963094e0bb161580564954dee512955c1c79d3476Greg Clayton if (exe_ctx.thread == NULL) 134063094e0bb161580564954dee512955c1c79d3476Greg Clayton exe_ctx.thread = exe_ctx.process->GetThreadList().GetThreadAtIndex(0).get(); 134163094e0bb161580564954dee512955c1c79d3476Greg Clayton if (exe_ctx.thread != NULL) 134263094e0bb161580564954dee512955c1c79d3476Greg Clayton { 134363094e0bb161580564954dee512955c1c79d3476Greg Clayton DisplayThreadsInfo (interpreter, &exe_ctx, result, false, false); 134463094e0bb161580564954dee512955c1c79d3476Greg Clayton } 134563094e0bb161580564954dee512955c1c79d3476Greg Clayton else 134663094e0bb161580564954dee512955c1c79d3476Greg Clayton { 134763094e0bb161580564954dee512955c1c79d3476Greg Clayton result.AppendError ("no valid thread found in current process"); 134863094e0bb161580564954dee512955c1c79d3476Greg Clayton result.SetStatus (eReturnStatusFailed); 134963094e0bb161580564954dee512955c1c79d3476Greg Clayton } 135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 135263094e0bb161580564954dee512955c1c79d3476Greg Clayton else 135363094e0bb161580564954dee512955c1c79d3476Greg Clayton { 135463094e0bb161580564954dee512955c1c79d3476Greg Clayton result.AppendError ("process is currently running"); 135563094e0bb161580564954dee512955c1c79d3476Greg Clayton result.SetStatus (eReturnStatusFailed); 135663094e0bb161580564954dee512955c1c79d3476Greg Clayton } 135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 135824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 135924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 136063094e0bb161580564954dee512955c1c79d3476Greg Clayton result.AppendError ("no current location or status available"); 136124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 136363094e0bb161580564954dee512955c1c79d3476Greg Clayton return result.Succeeded(); 136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 136563094e0bb161580564954dee512955c1c79d3476Greg Clayton}; 136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectMultiwordThread 136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 137163094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectMultiwordThread::CommandObjectMultiwordThread (CommandInterpreter &interpreter) : 137224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObjectMultiword ("thread", 137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "A set of commands for operating on one or more thread within a running process.", 137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "thread <subcommand> [<subcommand-options>]") 137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 137663094e0bb161580564954dee512955c1c79d3476Greg Clayton LoadSubCommand (interpreter, "backtrace", CommandObjectSP (new CommandObjectThreadBacktrace ())); 137763094e0bb161580564954dee512955c1c79d3476Greg Clayton LoadSubCommand (interpreter, "continue", CommandObjectSP (new CommandObjectThreadContinue ())); 137863094e0bb161580564954dee512955c1c79d3476Greg Clayton LoadSubCommand (interpreter, "list", CommandObjectSP (new CommandObjectThreadList ())); 137963094e0bb161580564954dee512955c1c79d3476Greg Clayton LoadSubCommand (interpreter, "select", CommandObjectSP (new CommandObjectThreadSelect ())); 138063094e0bb161580564954dee512955c1c79d3476Greg Clayton LoadSubCommand (interpreter, "until", CommandObjectSP (new CommandObjectThreadUntil ())); 138163094e0bb161580564954dee512955c1c79d3476Greg Clayton LoadSubCommand (interpreter, "step-in", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ( 138263094e0bb161580564954dee512955c1c79d3476Greg Clayton "thread step-in", 138363094e0bb161580564954dee512955c1c79d3476Greg Clayton "Source level single step in in specified thread (current thread, if none specified).", 138463094e0bb161580564954dee512955c1c79d3476Greg Clayton "thread step-in [<thread-id>]", 138563094e0bb161580564954dee512955c1c79d3476Greg Clayton eFlagProcessMustBeLaunched | eFlagProcessMustBePaused, 138663094e0bb161580564954dee512955c1c79d3476Greg Clayton eStepTypeInto, 138763094e0bb161580564954dee512955c1c79d3476Greg Clayton eStepScopeSource))); 138863094e0bb161580564954dee512955c1c79d3476Greg Clayton 138963094e0bb161580564954dee512955c1c79d3476Greg Clayton LoadSubCommand (interpreter, "step-out", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ("thread step-out", 139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Source level single step out in specified thread (current thread, if none specified).", 139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "thread step-out [<thread-id>]", 139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eFlagProcessMustBeLaunched | eFlagProcessMustBePaused, 139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eStepTypeOut, 139463094e0bb161580564954dee512955c1c79d3476Greg Clayton eStepScopeSource))); 139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 139663094e0bb161580564954dee512955c1c79d3476Greg Clayton LoadSubCommand (interpreter, "step-over", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ("thread step-over", 139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Source level single step over in specified thread (current thread, if none specified).", 139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "thread step-over [<thread-id>]", 139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eFlagProcessMustBeLaunched | eFlagProcessMustBePaused, 140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eStepTypeOver, 140163094e0bb161580564954dee512955c1c79d3476Greg Clayton eStepScopeSource))); 140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 140363094e0bb161580564954dee512955c1c79d3476Greg Clayton LoadSubCommand (interpreter, "step-inst", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ("thread step-inst", 140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Single step one instruction in specified thread (current thread, if none specified).", 140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "thread step-inst [<thread-id>]", 140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eFlagProcessMustBeLaunched | eFlagProcessMustBePaused, 140724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eStepTypeTrace, 140863094e0bb161580564954dee512955c1c79d3476Greg Clayton eStepScopeInstruction))); 140963094e0bb161580564954dee512955c1c79d3476Greg Clayton 141063094e0bb161580564954dee512955c1c79d3476Greg Clayton LoadSubCommand (interpreter, "step-inst-over", CommandObjectSP (new CommandObjectThreadStepWithTypeAndScope ("thread step-inst-over", 141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Single step one instruction in specified thread (current thread, if none specified), stepping over calls.", 141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "thread step-inst-over [<thread-id>]", 141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eFlagProcessMustBeLaunched | eFlagProcessMustBePaused, 141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eStepTypeTraceOver, 141563094e0bb161580564954dee512955c1c79d3476Greg Clayton eStepScopeInstruction))); 141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiwordThread::~CommandObjectMultiwordThread () 141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 142224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1423