[Lldb-commits] [lldb] [lldb] add command start (PR #67019)
José Lira Junior via lldb-commits
lldb-commits at lists.llvm.org
Mon Sep 25 14:14:52 PDT 2023
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?= <jljuniorpb at gmail.com>
Date: Thu, 21 Sep 2023 11:12:58 -0300
Subject: [PATCH 1/4] [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?= <jljuniorpb at gmail.com>
Date: Fri, 22 Sep 2023 12:13:25 -0300
Subject: [PATCH 2/4] [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">,
>From dc14fddab92c53f0cc06f06b1932d8af6434a8c8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20L=2E=20Junior?= <jljuniorpb at gmail.com>
Date: Mon, 25 Sep 2023 17:59:27 -0300
Subject: [PATCH 3/4] Revert "[lldb] add command start"
This reverts commit 11270775865a8415e00b4d899703f84717344967.
---
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 deletions(-)
delete mode 100644 lldb/source/Commands/CommandObjectStart.cpp
delete mode 100644 lldb/source/Commands/CommandObjectStart.h
diff --git a/lldb/source/Commands/CMakeLists.txt b/lldb/source/Commands/CMakeLists.txt
index 54c62e0f5284beb..6a36c5376d5c574 100644
--- a/lldb/source/Commands/CMakeLists.txt
+++ b/lldb/source/Commands/CMakeLists.txt
@@ -30,7 +30,6 @@ 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
deleted file mode 100644
index 7406143c50fec1b..000000000000000
--- a/lldb/source/Commands/CommandObjectStart.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-//===-- 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
deleted file mode 100644
index 8475a17c347f7be..000000000000000
--- a/lldb/source/Commands/CommandObjectStart.h
+++ /dev/null
@@ -1,32 +0,0 @@
-//===-- 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 5d6ad7f0dbb1e8e..dcff53ff843f328 100644
--- a/lldb/source/Interpreter/CommandInterpreter.cpp
+++ b/lldb/source/Interpreter/CommandInterpreter.cpp
@@ -36,7 +36,6 @@
#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"
@@ -560,7 +559,6 @@ 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 6d89f8ab286f5ebbf3e50b71defa52cebfcdcaac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jos=C3=A9=20L=2E=20Junior?= <jljuniorpb at gmail.com>
Date: Mon, 25 Sep 2023 18:14:32 -0300
Subject: [PATCH 4/4] [lldb] remove shell modification | make bp one-shot
---
lldb/source/Commands/CommandOptionsProcessLaunch.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lldb/source/Commands/CommandOptionsProcessLaunch.cpp b/lldb/source/Commands/CommandOptionsProcessLaunch.cpp
index 9f8d3047159cd72..b49d5936e5ba4af 100644
--- a/lldb/source/Commands/CommandOptionsProcessLaunch.cpp
+++ b/lldb/source/Commands/CommandOptionsProcessLaunch.cpp
@@ -47,7 +47,7 @@ Status CommandOptionsProcessLaunch::SetOptionValue(
0, eLazyBoolNo, false, false);
if (!bp_sp)
error.SetErrorString("Breakpoint creation failed.\n");
- launch_info.SetShell(HostInfo::GetDefaultShell());
+ bp_sp->SetOneShot(true);
break;
}
case 'i': // STDIN for read only
More information about the lldb-commits
mailing list