https://github.com/junior-jl updated https://github.com/llvm/llvm-project/pull/67019
From 11270775865a8415e00b4d899703f84717344967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20L=2E=20Junior?= <jljunio...@gmail.com> Date: Thu, 21 Sep 2023 11:12:58 -0300 Subject: [PATCH 1/2] [lldb] add command start --- lldb/source/Commands/CMakeLists.txt | 1 + lldb/source/Commands/CommandObjectStart.cpp | 102 ++++++++++++++++++ lldb/source/Commands/CommandObjectStart.h | 32 ++++++ .../source/Interpreter/CommandInterpreter.cpp | 2 + 4 files changed, 137 insertions(+) create mode 100644 lldb/source/Commands/CommandObjectStart.cpp create mode 100644 lldb/source/Commands/CommandObjectStart.h diff --git a/lldb/source/Commands/CMakeLists.txt b/lldb/source/Commands/CMakeLists.txt index 6a36c5376d5c574..54c62e0f5284beb 100644 --- a/lldb/source/Commands/CMakeLists.txt +++ b/lldb/source/Commands/CMakeLists.txt @@ -30,6 +30,7 @@ add_lldb_library(lldbCommands NO_PLUGIN_DEPENDENCIES CommandObjectSession.cpp CommandObjectSettings.cpp CommandObjectSource.cpp + CommandObjectStart.cpp CommandObjectStats.cpp CommandObjectTarget.cpp CommandObjectThread.cpp diff --git a/lldb/source/Commands/CommandObjectStart.cpp b/lldb/source/Commands/CommandObjectStart.cpp new file mode 100644 index 000000000000000..7406143c50fec1b --- /dev/null +++ b/lldb/source/Commands/CommandObjectStart.cpp @@ -0,0 +1,102 @@ +//===-- CommandObjectStart.cpp -------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "CommandObjectStart.h" +#include "lldb/Interpreter/CommandObject.h" + +using namespace lldb; +using namespace lldb_private; + +// Constructor for CommandObjectStart +CommandObjectStart::CommandObjectStart(CommandInterpreter &interpreter) + : CommandObjectParsed( + interpreter, "start", + "Launches the process and pauses execution at main function", + "start args [optional args]") { + // Define command arguments + CommandArgumentData pause_location{eArgTypeName, eArgRepeatPlain}; + m_arguments.push_back({pause_location}); +} + +CommandObjectStart::~CommandObjectStart() = default; + +// Execute the 'start' command +bool CommandObjectStart::DoExecute(Args &command, CommandReturnObject &result) { + // Check if the 'first' subcommand is specified + bool pause_at_first_instruction = false; + + if (command.GetArgumentCount() == 1 && + strcmp(command.GetArgumentAtIndex(0), "first") == 0) { + pause_at_first_instruction = true; + } + + // Get the current selected target + TargetSP target_sp = GetDebugger().GetSelectedTarget(); + if (!target_sp) { + result.AppendError("No target selected.\n"); + return false; + } + + // Create the breakpoint at main or the first instruction + BreakpointSP bp_sp; + if (pause_at_first_instruction) { + ModuleSP exe_module_sp = target_sp->GetExecutableModule(); + ObjectFile *object = exe_module_sp->GetObjectFile(); + Address address = object->GetEntryPointAddress(); + + if (!address.IsValid()) { + result.AppendError("Failed to get the entry point address"); + result.SetStatus(eReturnStatusFailed); + return false; + } + + bp_sp = target_sp->CreateBreakpoint(address, false, false); + + } else { + // Create a breakpoint at the main function + bp_sp = target_sp->CreateBreakpoint( + nullptr, nullptr, "main", eFunctionNameTypeAuto, eLanguageTypeUnknown, + 0, eLazyBoolNo, false, false); + } + + if (!bp_sp) { + result.AppendError("Breakpoint creation failed.\n"); + result.SetStatus(eReturnStatusFailed); + return false; + } else { + result.GetOutputStream().Printf("Breakpoint created%s.\n", + pause_at_first_instruction + ? " at first instruction" + : " in main function"); + result.SetStatus(eReturnStatusSuccessFinishResult); + } + + // Construct the process launch info + ProcessLaunchInfo launch_info; + launch_info.SetShell(HostInfo::GetDefaultShell()); + ModuleSP exe_module_sp = target_sp->GetExecutableModule(); + if (!exe_module_sp) { + result.AppendError("No executable module found.\n"); + return false; + } + + launch_info.SetExecutableFile(exe_module_sp->GetPlatformFileSpec(), true); + // Launch the process + StreamString stream; + Status error = target_sp->Launch(launch_info, &stream); + + if (error.Success()) { + result.SetStatus(eReturnStatusSuccessFinishResult); + result.GetOutputStream().Printf("Process launched successfully.\n"); + } else { + result.AppendErrorWithFormat("Process launch failed: %s\n", + error.AsCString()); + return false; + } + return result.Succeeded(); +} diff --git a/lldb/source/Commands/CommandObjectStart.h b/lldb/source/Commands/CommandObjectStart.h new file mode 100644 index 000000000000000..8475a17c347f7be --- /dev/null +++ b/lldb/source/Commands/CommandObjectStart.h @@ -0,0 +1,32 @@ +//===-- CommandObjectStart.h ---------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLDB_SOURCE_COMMANDS_COMMANDOBJECTStart_H +#define LLDB_SOURCE_COMMANDS_COMMANDOBJECTStart_H + +#include "lldb/Core/Module.h" +#include "lldb/Host/HostInfo.h" +#include "lldb/Host/ProcessLaunchInfo.h" +#include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Interpreter/CommandObject.h" +#include "lldb/Interpreter/CommandObjectMultiword.h" +#include "lldb/Interpreter/CommandReturnObject.h" +#include "lldb/Symbol/SymbolContext.h" + +namespace lldb_private { +class CommandObjectStart : public CommandObjectParsed { +public: + CommandObjectStart(CommandInterpreter &interpreter); + ~CommandObjectStart() override; + +protected: + bool DoExecute(Args &args, CommandReturnObject &result) override; +}; +} // namespace lldb_private + +#endif // LLDB_SOURCE_COMMANDS_COMMANDOBJECTStart_H diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp index dcff53ff843f328..5d6ad7f0dbb1e8e 100644 --- a/lldb/source/Interpreter/CommandInterpreter.cpp +++ b/lldb/source/Interpreter/CommandInterpreter.cpp @@ -36,6 +36,7 @@ #include "Commands/CommandObjectSession.h" #include "Commands/CommandObjectSettings.h" #include "Commands/CommandObjectSource.h" +#include "Commands/CommandObjectStart.h" #include "Commands/CommandObjectStats.h" #include "Commands/CommandObjectTarget.h" #include "Commands/CommandObjectThread.h" @@ -559,6 +560,7 @@ void CommandInterpreter::LoadCommandDictionary() { REGISTER_COMMAND_OBJECT("settings", CommandObjectMultiwordSettings); REGISTER_COMMAND_OBJECT("session", CommandObjectSession); REGISTER_COMMAND_OBJECT("source", CommandObjectMultiwordSource); + REGISTER_COMMAND_OBJECT("start", CommandObjectStart); REGISTER_COMMAND_OBJECT("statistics", CommandObjectStats); REGISTER_COMMAND_OBJECT("target", CommandObjectMultiwordTarget); REGISTER_COMMAND_OBJECT("thread", CommandObjectMultiwordThread); From ef09f2a8ca813a5048d6fb5411c0d2edad53ab57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20L=2E=20Junior?= <jljunio...@gmail.com> Date: Fri, 22 Sep 2023 12:13:25 -0300 Subject: [PATCH 2/2] [lldb] add stop-at-main option to process launch --- .../source/Commands/CommandOptionsProcessLaunch.cpp | 13 ++++++++++++- lldb/source/Commands/Options.td | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lldb/source/Commands/CommandOptionsProcessLaunch.cpp b/lldb/source/Commands/CommandOptionsProcessLaunch.cpp index 85ad8ff5e07132c..9f8d3047159cd72 100644 --- a/lldb/source/Commands/CommandOptionsProcessLaunch.cpp +++ b/lldb/source/Commands/CommandOptionsProcessLaunch.cpp @@ -38,7 +38,18 @@ Status CommandOptionsProcessLaunch::SetOptionValue( case 's': // Stop at program entry point launch_info.GetFlags().Set(eLaunchFlagStopAtEntry); break; - + case 'm': // Stop at main function + { + TargetSP target_sp = + execution_context ? execution_context->GetTargetSP() : TargetSP(); + BreakpointSP bp_sp = target_sp->CreateBreakpoint( + nullptr, nullptr, "main", eFunctionNameTypeAuto, eLanguageTypeUnknown, + 0, eLazyBoolNo, false, false); + if (!bp_sp) + error.SetErrorString("Breakpoint creation failed.\n"); + launch_info.SetShell(HostInfo::GetDefaultShell()); + break; + } case 'i': // STDIN for read only { FileAction action; diff --git a/lldb/source/Commands/Options.td b/lldb/source/Commands/Options.td index 04830b8b990efae..af2e662c05a5b47 100644 --- a/lldb/source/Commands/Options.td +++ b/lldb/source/Commands/Options.td @@ -675,6 +675,8 @@ let Command = "platform shell" in { let Command = "process launch" in { def process_launch_stop_at_entry : Option<"stop-at-entry", "s">, Desc<"Stop at the entry point of the program when launching a process.">; + def process_launch_stop_at_main : Option<"stop-at-main", "m">, + Desc<"Stop at the main function of the program when launching a process.">; def process_launch_disable_aslr : Option<"disable-aslr", "A">, Arg<"Boolean">, Desc<"Set whether to disable address space layout randomization when launching a process.">; def process_launch_plugin : Option<"plugin", "P">, Arg<"Plugin">, _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits