LLDB mainline
ScriptInterpreterPython.cpp
Go to the documentation of this file.
1//===-- ScriptInterpreterPython.cpp ---------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/Host/Config.h"
11
12#if LLDB_ENABLE_PYTHON
13
14// LLDB Python header must be included first
15#include "lldb-python.h"
16
18#include "PythonDataObjects.h"
19#include "PythonReadline.h"
20#include "SWIGPythonBridge.h"
22
23#include "lldb/API/SBError.h"
25#include "lldb/API/SBFrame.h"
26#include "lldb/API/SBValue.h"
29#include "lldb/Core/Debugger.h"
34#include "lldb/Host/HostInfo.h"
35#include "lldb/Host/Pipe.h"
38#include "lldb/Target/Thread.h"
42#include "lldb/Utility/Timer.h"
44#include "llvm/ADT/STLExtras.h"
45#include "llvm/ADT/StringRef.h"
46#include "llvm/Support/Error.h"
47#include "llvm/Support/FileSystem.h"
48#include "llvm/Support/FormatAdapters.h"
49
50#include <cstdio>
51#include <cstdlib>
52#include <memory>
53#include <mutex>
54#include <optional>
55#include <string>
56
57using namespace lldb;
58using namespace lldb_private;
59using namespace lldb_private::python;
60using llvm::Expected;
61
62LLDB_PLUGIN_DEFINE(ScriptInterpreterPython)
63
64// Defined in the SWIG source file
65extern "C" PyObject *PyInit__lldb(void);
66
67#define LLDBSwigPyInit PyInit__lldb
68
69#if defined(_WIN32)
70// Don't mess with the signal handlers on Windows.
71#define LLDB_USE_PYTHON_SET_INTERRUPT 0
72#else
73// PyErr_SetInterrupt was introduced in 3.2.
74#define LLDB_USE_PYTHON_SET_INTERRUPT PY_VERSION_HEX >= 0x03020000
75#endif
76
77static ScriptInterpreterPythonImpl *GetPythonInterpreter(Debugger &debugger) {
78 ScriptInterpreter *script_interpreter =
80 return static_cast<ScriptInterpreterPythonImpl *>(script_interpreter);
81}
82
83namespace {
84
85// Initializing Python is not a straightforward process. We cannot control
86// what external code may have done before getting to this point in LLDB,
87// including potentially having already initialized Python, so we need to do a
88// lot of work to ensure that the existing state of the system is maintained
89// across our initialization. We do this by using an RAII pattern where we
90// save off initial state at the beginning, and restore it at the end
91struct InitializePythonRAII {
92public:
93 InitializePythonRAII() {
94#if PY_VERSION_HEX >= 0x03080000
95 PyConfig config;
96 PyConfig_InitPythonConfig(&config);
97#endif
98
99#if LLDB_EMBED_PYTHON_HOME
100 static std::string g_python_home = []() -> std::string {
101 if (llvm::sys::path::is_absolute(LLDB_PYTHON_HOME))
102 return LLDB_PYTHON_HOME;
103
104 FileSpec spec = HostInfo::GetShlibDir();
105 if (!spec)
106 return {};
107 spec.AppendPathComponent(LLDB_PYTHON_HOME);
108 return spec.GetPath();
109 }();
110 if (!g_python_home.empty()) {
111#if PY_VERSION_HEX >= 0x03080000
112 PyConfig_SetBytesString(&config, &config.home, g_python_home.c_str());
113#else
114 size_t size = 0;
115 wchar_t *python_home_w = Py_DecodeLocale(g_python_home.c_str(), &size);
116 Py_SetPythonHome(python_home_w);
117 PyMem_RawFree(python_home_w);
118#endif
119 }
120#endif
121
122 // The table of built-in modules can only be extended before Python is
123 // initialized.
124 if (!Py_IsInitialized()) {
125#ifdef LLDB_USE_LIBEDIT_READLINE_COMPAT_MODULE
126 // Python's readline is incompatible with libedit being linked into lldb.
127 // Provide a patched version local to the embedded interpreter.
128 bool ReadlinePatched = false;
129 for (auto *p = PyImport_Inittab; p->name != nullptr; p++) {
130 if (strcmp(p->name, "readline") == 0) {
131 p->initfunc = initlldb_readline;
132 break;
133 }
134 }
135 if (!ReadlinePatched) {
136 PyImport_AppendInittab("readline", initlldb_readline);
137 ReadlinePatched = true;
138 }
139#endif
140
141 // Register _lldb as a built-in module.
142 PyImport_AppendInittab("_lldb", LLDBSwigPyInit);
143 }
144
145#if PY_VERSION_HEX >= 0x03080000
146 config.install_signal_handlers = 0;
147 Py_InitializeFromConfig(&config);
148 PyConfig_Clear(&config);
149 InitializeThreadsPrivate();
150#else
151// Python < 3.2 and Python >= 3.2 reversed the ordering requirements for
152// calling `Py_Initialize` and `PyEval_InitThreads`. < 3.2 requires that you
153// call `PyEval_InitThreads` first, and >= 3.2 requires that you call it last.
154#if PY_VERSION_HEX >= 0x03020000
155 Py_InitializeEx(0);
156 InitializeThreadsPrivate();
157#else
158 InitializeThreadsPrivate();
159 Py_InitializeEx(0);
160#endif
161#endif
162 }
163
164 ~InitializePythonRAII() {
165 if (m_was_already_initialized) {
166 Log *log = GetLog(LLDBLog::Script);
167 LLDB_LOGV(log, "Releasing PyGILState. Returning to state = {0}locked",
168 m_gil_state == PyGILState_UNLOCKED ? "un" : "");
169 PyGILState_Release(m_gil_state);
170 } else {
171 // We initialized the threads in this function, just unlock the GIL.
172 PyEval_SaveThread();
173 }
174 }
175
176private:
177 void InitializeThreadsPrivate() {
178// Since Python 3.7 `Py_Initialize` calls `PyEval_InitThreads` inside itself,
179// so there is no way to determine whether the embedded interpreter
180// was already initialized by some external code. `PyEval_ThreadsInitialized`
181// would always return `true` and `PyGILState_Ensure/Release` flow would be
182// executed instead of unlocking GIL with `PyEval_SaveThread`. When
183// an another thread calls `PyGILState_Ensure` it would get stuck in deadlock.
184#if PY_VERSION_HEX >= 0x03070000
185 // The only case we should go further and acquire the GIL: it is unlocked.
186 if (PyGILState_Check())
187 return;
188#endif
189
190// `PyEval_ThreadsInitialized` was deprecated in Python 3.9 and removed in
191// Python 3.13. It has been returning `true` always since Python 3.7.
192#if PY_VERSION_HEX < 0x03090000
193 if (PyEval_ThreadsInitialized()) {
194#else
195 if (true) {
196#endif
197 Log *log = GetLog(LLDBLog::Script);
198
199 m_was_already_initialized = true;
200 m_gil_state = PyGILState_Ensure();
201 LLDB_LOGV(log, "Ensured PyGILState. Previous state = {0}locked\n",
202 m_gil_state == PyGILState_UNLOCKED ? "un" : "");
203
204// `PyEval_InitThreads` was deprecated in Python 3.9 and removed in
205// Python 3.13.
206#if PY_VERSION_HEX < 0x03090000
207 return;
208 }
209
210 // InitThreads acquires the GIL if it hasn't been called before.
211 PyEval_InitThreads();
212#else
213 }
214#endif
215 }
216
217 PyGILState_STATE m_gil_state = PyGILState_UNLOCKED;
218 bool m_was_already_initialized = false;
219};
220
221#if LLDB_USE_PYTHON_SET_INTERRUPT
222/// Saves the current signal handler for the specified signal and restores
223/// it at the end of the current scope.
224struct RestoreSignalHandlerScope {
225 /// The signal handler.
226 struct sigaction m_prev_handler;
227 int m_signal_code;
228 RestoreSignalHandlerScope(int signal_code) : m_signal_code(signal_code) {
229 // Initialize sigaction to their default state.
230 std::memset(&m_prev_handler, 0, sizeof(m_prev_handler));
231 // Don't install a new handler, just read back the old one.
232 struct sigaction *new_handler = nullptr;
233 int signal_err = ::sigaction(m_signal_code, new_handler, &m_prev_handler);
234 lldbassert(signal_err == 0 && "sigaction failed to read handler");
235 }
236 ~RestoreSignalHandlerScope() {
237 int signal_err = ::sigaction(m_signal_code, &m_prev_handler, nullptr);
238 lldbassert(signal_err == 0 && "sigaction failed to restore old handler");
239 }
240};
241#endif
242} // namespace
243
244void ScriptInterpreterPython::ComputePythonDirForApple(
246 auto style = llvm::sys::path::Style::posix;
247
248 llvm::StringRef path_ref(path.begin(), path.size());
249 auto rbegin = llvm::sys::path::rbegin(path_ref, style);
250 auto rend = llvm::sys::path::rend(path_ref);
251 auto framework = std::find(rbegin, rend, "LLDB.framework");
252 if (framework == rend) {
253 ComputePythonDir(path);
254 return;
255 }
256 path.resize(framework - rend);
257 llvm::sys::path::append(path, style, "LLDB.framework", "Resources", "Python");
258}
259
260void ScriptInterpreterPython::ComputePythonDir(
262 // Build the path by backing out of the lib dir, then building with whatever
263 // the real python interpreter uses. (e.g. lib for most, lib64 on RHEL
264 // x86_64, or bin on Windows).
265 llvm::sys::path::remove_filename(path);
266 llvm::sys::path::append(path, LLDB_PYTHON_RELATIVE_LIBDIR);
267
268#if defined(_WIN32)
269 // This will be injected directly through FileSpec.SetDirectory(),
270 // so we need to normalize manually.
271 std::replace(path.begin(), path.end(), '\\', '/');
272#endif
273}
274
275FileSpec ScriptInterpreterPython::GetPythonDir() {
276 static FileSpec g_spec = []() {
277 FileSpec spec = HostInfo::GetShlibDir();
278 if (!spec)
279 return FileSpec();
280 llvm::SmallString<64> path;
281 spec.GetPath(path);
282
283#if defined(__APPLE__)
284 ComputePythonDirForApple(path);
285#else
286 ComputePythonDir(path);
287#endif
288 spec.SetDirectory(path);
289 return spec;
290 }();
291 return g_spec;
292}
293
294static const char GetInterpreterInfoScript[] = R"(
295import os
296import sys
297
298def main(lldb_python_dir, python_exe_relative_path):
299 info = {
300 "lldb-pythonpath": lldb_python_dir,
301 "language": "python",
302 "prefix": sys.prefix,
303 "executable": os.path.join(sys.prefix, python_exe_relative_path)
304 }
305 return info
306)";
307
308static const char python_exe_relative_path[] = LLDB_PYTHON_EXE_RELATIVE_PATH;
309
310StructuredData::DictionarySP ScriptInterpreterPython::GetInterpreterInfo() {
311 GIL gil;
312 FileSpec python_dir_spec = GetPythonDir();
313 if (!python_dir_spec)
314 return nullptr;
315 PythonScript get_info(GetInterpreterInfoScript);
316 auto info_json = unwrapIgnoringErrors(
317 As<PythonDictionary>(get_info(PythonString(python_dir_spec.GetPath()),
318 PythonString(python_exe_relative_path))));
319 if (!info_json)
320 return nullptr;
321 return info_json.CreateStructuredDictionary();
322}
323
324void ScriptInterpreterPython::SharedLibraryDirectoryHelper(
325 FileSpec &this_file) {
326 // When we're loaded from python, this_file will point to the file inside the
327 // python package directory. Replace it with the one in the lib directory.
328#ifdef _WIN32
329 // On windows, we need to manually back out of the python tree, and go into
330 // the bin directory. This is pretty much the inverse of what ComputePythonDir
331 // does.
332 if (this_file.GetFileNameExtension() == ".pyd") {
333 this_file.RemoveLastPathComponent(); // _lldb.pyd or _lldb_d.pyd
334 this_file.RemoveLastPathComponent(); // lldb
335 llvm::StringRef libdir = LLDB_PYTHON_RELATIVE_LIBDIR;
336 for (auto it = llvm::sys::path::begin(libdir),
337 end = llvm::sys::path::end(libdir);
338 it != end; ++it)
339 this_file.RemoveLastPathComponent();
340 this_file.AppendPathComponent("bin");
341 this_file.AppendPathComponent("liblldb.dll");
342 }
343#else
344 // The python file is a symlink, so we can find the real library by resolving
345 // it. We can do this unconditionally.
346 FileSystem::Instance().ResolveSymbolicLink(this_file, this_file);
347#endif
348}
349
350llvm::StringRef ScriptInterpreterPython::GetPluginDescriptionStatic() {
351 return "Embedded Python interpreter";
352}
353
354void ScriptInterpreterPython::Initialize() {
355 static llvm::once_flag g_once_flag;
356 llvm::call_once(g_once_flag, []() {
357 PluginManager::RegisterPlugin(GetPluginNameStatic(),
358 GetPluginDescriptionStatic(),
360 ScriptInterpreterPythonImpl::CreateInstance);
361 ScriptInterpreterPythonImpl::Initialize();
362 });
363}
364
365void ScriptInterpreterPython::Terminate() {}
366
367ScriptInterpreterPythonImpl::Locker::Locker(
368 ScriptInterpreterPythonImpl *py_interpreter, uint16_t on_entry,
369 uint16_t on_leave, FileSP in, FileSP out, FileSP err)
371 m_teardown_session((on_leave & TearDownSession) == TearDownSession),
372 m_python_interpreter(py_interpreter) {
373 DoAcquireLock();
374 if ((on_entry & InitSession) == InitSession) {
375 if (!DoInitSession(on_entry, in, out, err)) {
376 // Don't teardown the session if we didn't init it.
377 m_teardown_session = false;
378 }
379 }
380}
381
382bool ScriptInterpreterPythonImpl::Locker::DoAcquireLock() {
383 Log *log = GetLog(LLDBLog::Script);
384 m_GILState = PyGILState_Ensure();
385 LLDB_LOGV(log, "Ensured PyGILState. Previous state = {0}locked",
386 m_GILState == PyGILState_UNLOCKED ? "un" : "");
387
388 // we need to save the thread state when we first start the command because
389 // we might decide to interrupt it while some action is taking place outside
390 // of Python (e.g. printing to screen, waiting for the network, ...) in that
391 // case, _PyThreadState_Current will be NULL - and we would be unable to set
392 // the asynchronous exception - not a desirable situation
393 m_python_interpreter->SetThreadState(PyThreadState_Get());
394 m_python_interpreter->IncrementLockCount();
395 return true;
396}
397
398bool ScriptInterpreterPythonImpl::Locker::DoInitSession(uint16_t on_entry_flags,
399 FileSP in, FileSP out,
400 FileSP err) {
401 if (!m_python_interpreter)
402 return false;
403 return m_python_interpreter->EnterSession(on_entry_flags, in, out, err);
404}
405
406bool ScriptInterpreterPythonImpl::Locker::DoFreeLock() {
407 Log *log = GetLog(LLDBLog::Script);
408 LLDB_LOGV(log, "Releasing PyGILState. Returning to state = {0}locked",
409 m_GILState == PyGILState_UNLOCKED ? "un" : "");
410 PyGILState_Release(m_GILState);
411 m_python_interpreter->DecrementLockCount();
412 return true;
413}
414
415bool ScriptInterpreterPythonImpl::Locker::DoTearDownSession() {
416 if (!m_python_interpreter)
417 return false;
418 m_python_interpreter->LeaveSession();
419 return true;
420}
421
422ScriptInterpreterPythonImpl::Locker::~Locker() {
423 if (m_teardown_session)
424 DoTearDownSession();
425 DoFreeLock();
426}
427
428ScriptInterpreterPythonImpl::ScriptInterpreterPythonImpl(Debugger &debugger)
429 : ScriptInterpreterPython(debugger), m_saved_stdin(), m_saved_stdout(),
430 m_saved_stderr(), m_main_module(),
431 m_session_dict(PyInitialValue::Invalid),
432 m_sys_module_dict(PyInitialValue::Invalid), m_run_one_line_function(),
433 m_run_one_line_str_global(),
434 m_dictionary_name(m_debugger.GetInstanceName()),
435 m_active_io_handler(eIOHandlerNone), m_session_is_active(false),
436 m_pty_secondary_is_open(false), m_valid_session(true), m_lock_count(0),
437 m_command_thread_state(nullptr) {
438
439 m_dictionary_name.append("_dict");
440 StreamString run_string;
441 run_string.Printf("%s = dict()", m_dictionary_name.c_str());
442
443 Locker locker(this, Locker::AcquireLock, Locker::FreeAcquiredLock);
444 PyRun_SimpleString(run_string.GetData());
445
446 run_string.Clear();
447 run_string.Printf(
448 "run_one_line (%s, 'import copy, keyword, os, re, sys, uuid, lldb')",
449 m_dictionary_name.c_str());
450 PyRun_SimpleString(run_string.GetData());
451
452 // Reloading modules requires a different syntax in Python 2 and Python 3.
453 // This provides a consistent syntax no matter what version of Python.
454 run_string.Clear();
455 run_string.Printf(
456 "run_one_line (%s, 'from importlib import reload as reload_module')",
457 m_dictionary_name.c_str());
458 PyRun_SimpleString(run_string.GetData());
459
460 // WARNING: temporary code that loads Cocoa formatters - this should be done
461 // on a per-platform basis rather than loading the whole set and letting the
462 // individual formatter classes exploit APIs to check whether they can/cannot
463 // do their task
464 run_string.Clear();
465 run_string.Printf(
466 "run_one_line (%s, 'import lldb.formatters, lldb.formatters.cpp')",
467 m_dictionary_name.c_str());
468 PyRun_SimpleString(run_string.GetData());
469 run_string.Clear();
470
471 run_string.Printf("run_one_line (%s, 'import lldb.embedded_interpreter; from "
472 "lldb.embedded_interpreter import run_python_interpreter; "
473 "from lldb.embedded_interpreter import run_one_line')",
474 m_dictionary_name.c_str());
475 PyRun_SimpleString(run_string.GetData());
476 run_string.Clear();
477
478 run_string.Printf("run_one_line (%s, 'lldb.debugger_unique_id = %" PRIu64
479 "')",
480 m_dictionary_name.c_str(), m_debugger.GetID());
481 PyRun_SimpleString(run_string.GetData());
482}
483
484ScriptInterpreterPythonImpl::~ScriptInterpreterPythonImpl() {
485 // the session dictionary may hold objects with complex state which means
486 // that they may need to be torn down with some level of smarts and that, in
487 // turn, requires a valid thread state force Python to procure itself such a
488 // thread state, nuke the session dictionary and then release it for others
489 // to use and proceed with the rest of the shutdown
490 auto gil_state = PyGILState_Ensure();
491 m_session_dict.Reset();
492 PyGILState_Release(gil_state);
493}
494
495void ScriptInterpreterPythonImpl::IOHandlerActivated(IOHandler &io_handler,
496 bool interactive) {
497 const char *instructions = nullptr;
498
499 switch (m_active_io_handler) {
500 case eIOHandlerNone:
501 break;
503 instructions = R"(Enter your Python command(s). Type 'DONE' to end.
504def function (frame, bp_loc, internal_dict):
505 """frame: the lldb.SBFrame for the location at which you stopped
506 bp_loc: an lldb.SBBreakpointLocation for the breakpoint location information
507 internal_dict: an LLDB support object not to be used"""
508)";
509 break;
511 instructions = "Enter your Python command(s). Type 'DONE' to end.\n";
512 break;
513 }
514
515 if (instructions) {
516 StreamFileSP output_sp(io_handler.GetOutputStreamFileSP());
517 if (output_sp && interactive) {
518 output_sp->PutCString(instructions);
519 output_sp->Flush();
520 }
521 }
522}
523
524void ScriptInterpreterPythonImpl::IOHandlerInputComplete(IOHandler &io_handler,
525 std::string &data) {
526 io_handler.SetIsDone(true);
527 bool batch_mode = m_debugger.GetCommandInterpreter().GetBatchCommandMode();
528
529 switch (m_active_io_handler) {
530 case eIOHandlerNone:
531 break;
533 std::vector<std::reference_wrapper<BreakpointOptions>> *bp_options_vec =
534 (std::vector<std::reference_wrapper<BreakpointOptions>> *)
535 io_handler.GetUserData();
536 for (BreakpointOptions &bp_options : *bp_options_vec) {
537
538 auto data_up = std::make_unique<CommandDataPython>();
539 if (!data_up)
540 break;
541 data_up->user_source.SplitIntoLines(data);
542
543 if (GenerateBreakpointCommandCallbackData(data_up->user_source,
544 data_up->script_source,
545 /*has_extra_args=*/false,
546 /*is_callback=*/false)
547 .Success()) {
548 auto baton_sp = std::make_shared<BreakpointOptions::CommandBaton>(
549 std::move(data_up));
550 bp_options.SetCallback(
551 ScriptInterpreterPythonImpl::BreakpointCallbackFunction, baton_sp);
552 } else if (!batch_mode) {
553 StreamFileSP error_sp = io_handler.GetErrorStreamFileSP();
554 if (error_sp) {
555 error_sp->Printf("Warning: No command attached to breakpoint.\n");
556 error_sp->Flush();
557 }
558 }
559 }
560 m_active_io_handler = eIOHandlerNone;
561 } break;
563 WatchpointOptions *wp_options =
564 (WatchpointOptions *)io_handler.GetUserData();
565 auto data_up = std::make_unique<WatchpointOptions::CommandData>();
566 data_up->user_source.SplitIntoLines(data);
567
568 if (GenerateWatchpointCommandCallbackData(data_up->user_source,
569 data_up->script_source,
570 /*is_callback=*/false)) {
571 auto baton_sp =
572 std::make_shared<WatchpointOptions::CommandBaton>(std::move(data_up));
573 wp_options->SetCallback(
574 ScriptInterpreterPythonImpl::WatchpointCallbackFunction, baton_sp);
575 } else if (!batch_mode) {
576 StreamFileSP error_sp = io_handler.GetErrorStreamFileSP();
577 if (error_sp) {
578 error_sp->Printf("Warning: No command attached to breakpoint.\n");
579 error_sp->Flush();
580 }
581 }
582 m_active_io_handler = eIOHandlerNone;
583 } break;
584 }
585}
586
588ScriptInterpreterPythonImpl::CreateInstance(Debugger &debugger) {
589 return std::make_shared<ScriptInterpreterPythonImpl>(debugger);
590}
591
592void ScriptInterpreterPythonImpl::LeaveSession() {
593 Log *log = GetLog(LLDBLog::Script);
594 if (log)
595 log->PutCString("ScriptInterpreterPythonImpl::LeaveSession()");
596
597 // Unset the LLDB global variables.
598 PyRun_SimpleString("lldb.debugger = None; lldb.target = None; lldb.process "
599 "= None; lldb.thread = None; lldb.frame = None");
600
601 // checking that we have a valid thread state - since we use our own
602 // threading and locking in some (rare) cases during cleanup Python may end
603 // up believing we have no thread state and PyImport_AddModule will crash if
604 // that is the case - since that seems to only happen when destroying the
605 // SBDebugger, we can make do without clearing up stdout and stderr
606 if (PyThreadState_GetDict()) {
607 PythonDictionary &sys_module_dict = GetSysModuleDictionary();
608 if (sys_module_dict.IsValid()) {
609 if (m_saved_stdin.IsValid()) {
610 sys_module_dict.SetItemForKey(PythonString("stdin"), m_saved_stdin);
611 m_saved_stdin.Reset();
612 }
613 if (m_saved_stdout.IsValid()) {
614 sys_module_dict.SetItemForKey(PythonString("stdout"), m_saved_stdout);
615 m_saved_stdout.Reset();
616 }
617 if (m_saved_stderr.IsValid()) {
618 sys_module_dict.SetItemForKey(PythonString("stderr"), m_saved_stderr);
619 m_saved_stderr.Reset();
620 }
621 }
622 }
623
624 m_session_is_active = false;
625}
626
627bool ScriptInterpreterPythonImpl::SetStdHandle(FileSP file_sp,
628 const char *py_name,
629 PythonObject &save_file,
630 const char *mode) {
631 if (!file_sp || !*file_sp) {
632 save_file.Reset();
633 return false;
634 }
635 File &file = *file_sp;
636
637 // Flush the file before giving it to python to avoid interleaved output.
638 file.Flush();
639
640 PythonDictionary &sys_module_dict = GetSysModuleDictionary();
641
642 auto new_file = PythonFile::FromFile(file, mode);
643 if (!new_file) {
644 llvm::consumeError(new_file.takeError());
645 return false;
646 }
647
648 save_file = sys_module_dict.GetItemForKey(PythonString(py_name));
649
650 sys_module_dict.SetItemForKey(PythonString(py_name), new_file.get());
651 return true;
652}
653
654bool ScriptInterpreterPythonImpl::EnterSession(uint16_t on_entry_flags,
655 FileSP in_sp, FileSP out_sp,
656 FileSP err_sp) {
657 // If we have already entered the session, without having officially 'left'
658 // it, then there is no need to 'enter' it again.
659 Log *log = GetLog(LLDBLog::Script);
660 if (m_session_is_active) {
661 LLDB_LOGF(
662 log,
663 "ScriptInterpreterPythonImpl::EnterSession(on_entry_flags=0x%" PRIx16
664 ") session is already active, returning without doing anything",
665 on_entry_flags);
666 return false;
667 }
668
669 LLDB_LOGF(
670 log,
671 "ScriptInterpreterPythonImpl::EnterSession(on_entry_flags=0x%" PRIx16 ")",
672 on_entry_flags);
673
674 m_session_is_active = true;
675
676 StreamString run_string;
677
678 if (on_entry_flags & Locker::InitGlobals) {
679 run_string.Printf("run_one_line (%s, 'lldb.debugger_unique_id = %" PRIu64,
680 m_dictionary_name.c_str(), m_debugger.GetID());
681 run_string.Printf(
682 "; lldb.debugger = lldb.SBDebugger.FindDebuggerWithID (%" PRIu64 ")",
683 m_debugger.GetID());
684 run_string.PutCString("; lldb.target = lldb.debugger.GetSelectedTarget()");
685 run_string.PutCString("; lldb.process = lldb.target.GetProcess()");
686 run_string.PutCString("; lldb.thread = lldb.process.GetSelectedThread ()");
687 run_string.PutCString("; lldb.frame = lldb.thread.GetSelectedFrame ()");
688 run_string.PutCString("')");
689 } else {
690 // If we aren't initing the globals, we should still always set the
691 // debugger (since that is always unique.)
692 run_string.Printf("run_one_line (%s, 'lldb.debugger_unique_id = %" PRIu64,
693 m_dictionary_name.c_str(), m_debugger.GetID());
694 run_string.Printf(
695 "; lldb.debugger = lldb.SBDebugger.FindDebuggerWithID (%" PRIu64 ")",
696 m_debugger.GetID());
697 run_string.PutCString("')");
698 }
699
700 PyRun_SimpleString(run_string.GetData());
701 run_string.Clear();
702
703 PythonDictionary &sys_module_dict = GetSysModuleDictionary();
704 if (sys_module_dict.IsValid()) {
705 lldb::FileSP top_in_sp;
706 lldb::StreamFileSP top_out_sp, top_err_sp;
707 if (!in_sp || !out_sp || !err_sp || !*in_sp || !*out_sp || !*err_sp)
708 m_debugger.AdoptTopIOHandlerFilesIfInvalid(top_in_sp, top_out_sp,
709 top_err_sp);
710
711 if (on_entry_flags & Locker::NoSTDIN) {
712 m_saved_stdin.Reset();
713 } else {
714 if (!SetStdHandle(in_sp, "stdin", m_saved_stdin, "r")) {
715 if (top_in_sp)
716 SetStdHandle(top_in_sp, "stdin", m_saved_stdin, "r");
717 }
718 }
719
720 if (!SetStdHandle(out_sp, "stdout", m_saved_stdout, "w")) {
721 if (top_out_sp)
722 SetStdHandle(top_out_sp->GetFileSP(), "stdout", m_saved_stdout, "w");
723 }
724
725 if (!SetStdHandle(err_sp, "stderr", m_saved_stderr, "w")) {
726 if (top_err_sp)
727 SetStdHandle(top_err_sp->GetFileSP(), "stderr", m_saved_stderr, "w");
728 }
729 }
730
731 if (PyErr_Occurred())
732 PyErr_Clear();
733
734 return true;
735}
736
737PythonModule &ScriptInterpreterPythonImpl::GetMainModule() {
738 if (!m_main_module.IsValid())
739 m_main_module = unwrapIgnoringErrors(PythonModule::Import("__main__"));
740 return m_main_module;
741}
742
743PythonDictionary &ScriptInterpreterPythonImpl::GetSessionDictionary() {
744 if (m_session_dict.IsValid())
745 return m_session_dict;
746
747 PythonObject &main_module = GetMainModule();
748 if (!main_module.IsValid())
749 return m_session_dict;
750
751 PythonDictionary main_dict(PyRefType::Borrowed,
752 PyModule_GetDict(main_module.get()));
753 if (!main_dict.IsValid())
754 return m_session_dict;
755
756 m_session_dict = unwrapIgnoringErrors(
757 As<PythonDictionary>(main_dict.GetItem(m_dictionary_name)));
758 return m_session_dict;
759}
760
761PythonDictionary &ScriptInterpreterPythonImpl::GetSysModuleDictionary() {
762 if (m_sys_module_dict.IsValid())
763 return m_sys_module_dict;
764 PythonModule sys_module = unwrapIgnoringErrors(PythonModule::Import("sys"));
765 m_sys_module_dict = sys_module.GetDictionary();
766 return m_sys_module_dict;
767}
768
769llvm::Expected<unsigned>
770ScriptInterpreterPythonImpl::GetMaxPositionalArgumentsForCallable(
771 const llvm::StringRef &callable_name) {
772 if (callable_name.empty()) {
773 return llvm::createStringError(llvm::inconvertibleErrorCode(),
774 "called with empty callable name.");
775 }
776 Locker py_lock(this,
777 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
778 auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(
779 m_dictionary_name);
780 auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(
781 callable_name, dict);
782 if (!pfunc.IsAllocated()) {
783 return llvm::createStringError(llvm::inconvertibleErrorCode(),
784 "can't find callable: %s",
785 callable_name.str().c_str());
786 }
787 llvm::Expected<PythonCallable::ArgInfo> arg_info = pfunc.GetArgInfo();
788 if (!arg_info)
789 return arg_info.takeError();
790 return arg_info.get().max_positional_args;
791}
792
793static std::string GenerateUniqueName(const char *base_name_wanted,
794 uint32_t &functions_counter,
795 const void *name_token = nullptr) {
796 StreamString sstr;
797
798 if (!base_name_wanted)
799 return std::string();
800
801 if (!name_token)
802 sstr.Printf("%s_%d", base_name_wanted, functions_counter++);
803 else
804 sstr.Printf("%s_%p", base_name_wanted, name_token);
805
806 return std::string(sstr.GetString());
807}
808
809bool ScriptInterpreterPythonImpl::GetEmbeddedInterpreterModuleObjects() {
810 if (m_run_one_line_function.IsValid())
811 return true;
812
813 PythonObject module(PyRefType::Borrowed,
814 PyImport_AddModule("lldb.embedded_interpreter"));
815 if (!module.IsValid())
816 return false;
817
818 PythonDictionary module_dict(PyRefType::Borrowed,
819 PyModule_GetDict(module.get()));
820 if (!module_dict.IsValid())
821 return false;
822
823 m_run_one_line_function =
824 module_dict.GetItemForKey(PythonString("run_one_line"));
825 m_run_one_line_str_global =
826 module_dict.GetItemForKey(PythonString("g_run_one_line_str"));
827 return m_run_one_line_function.IsValid();
828}
829
830bool ScriptInterpreterPythonImpl::ExecuteOneLine(
831 llvm::StringRef command, CommandReturnObject *result,
832 const ExecuteScriptOptions &options) {
833 std::string command_str = command.str();
834
835 if (!m_valid_session)
836 return false;
837
838 if (!command.empty()) {
839 // We want to call run_one_line, passing in the dictionary and the command
840 // string. We cannot do this through PyRun_SimpleString here because the
841 // command string may contain escaped characters, and putting it inside
842 // another string to pass to PyRun_SimpleString messes up the escaping. So
843 // we use the following more complicated method to pass the command string
844 // directly down to Python.
845 llvm::Expected<std::unique_ptr<ScriptInterpreterIORedirect>>
846 io_redirect_or_error = ScriptInterpreterIORedirect::Create(
847 options.GetEnableIO(), m_debugger, result);
848 if (!io_redirect_or_error) {
849 if (result)
851 "failed to redirect I/O: {0}\n",
852 llvm::fmt_consume(io_redirect_or_error.takeError()));
853 else
854 llvm::consumeError(io_redirect_or_error.takeError());
855 return false;
856 }
857
858 ScriptInterpreterIORedirect &io_redirect = **io_redirect_or_error;
859
860 bool success = false;
861 {
862 // WARNING! It's imperative that this RAII scope be as tight as
863 // possible. In particular, the scope must end *before* we try to join
864 // the read thread. The reason for this is that a pre-requisite for
865 // joining the read thread is that we close the write handle (to break
866 // the pipe and cause it to wake up and exit). But acquiring the GIL as
867 // below will redirect Python's stdio to use this same handle. If we
868 // close the handle while Python is still using it, bad things will
869 // happen.
870 Locker locker(
871 this,
872 Locker::AcquireLock | Locker::InitSession |
873 (options.GetSetLLDBGlobals() ? Locker::InitGlobals : 0) |
874 ((result && result->GetInteractive()) ? 0 : Locker::NoSTDIN),
875 Locker::FreeAcquiredLock | Locker::TearDownSession,
876 io_redirect.GetInputFile(), io_redirect.GetOutputFile(),
877 io_redirect.GetErrorFile());
878
879 // Find the correct script interpreter dictionary in the main module.
880 PythonDictionary &session_dict = GetSessionDictionary();
881 if (session_dict.IsValid()) {
882 if (GetEmbeddedInterpreterModuleObjects()) {
883 if (PyCallable_Check(m_run_one_line_function.get())) {
884 PythonObject pargs(
885 PyRefType::Owned,
886 Py_BuildValue("(Os)", session_dict.get(), command_str.c_str()));
887 if (pargs.IsValid()) {
888 PythonObject return_value(
889 PyRefType::Owned,
890 PyObject_CallObject(m_run_one_line_function.get(),
891 pargs.get()));
892 if (return_value.IsValid())
893 success = true;
894 else if (options.GetMaskoutErrors() && PyErr_Occurred()) {
895 PyErr_Print();
896 PyErr_Clear();
897 }
898 }
899 }
900 }
901 }
902
903 io_redirect.Flush();
904 }
905
906 if (success)
907 return true;
908
909 // The one-liner failed. Append the error message.
910 if (result) {
911 result->AppendErrorWithFormat(
912 "python failed attempting to evaluate '%s'\n", command_str.c_str());
913 }
914 return false;
915 }
916
917 if (result)
918 result->AppendError("empty command passed to python\n");
919 return false;
920}
921
922void ScriptInterpreterPythonImpl::ExecuteInterpreterLoop() {
924
925 Debugger &debugger = m_debugger;
926
927 // At the moment, the only time the debugger does not have an input file
928 // handle is when this is called directly from Python, in which case it is
929 // both dangerous and unnecessary (not to mention confusing) to try to embed
930 // a running interpreter loop inside the already running Python interpreter
931 // loop, so we won't do it.
932
933 if (!debugger.GetInputFile().IsValid())
934 return;
935
936 IOHandlerSP io_handler_sp(new IOHandlerPythonInterpreter(debugger, this));
937 if (io_handler_sp) {
938 debugger.RunIOHandlerAsync(io_handler_sp);
939 }
940}
941
942bool ScriptInterpreterPythonImpl::Interrupt() {
943#if LLDB_USE_PYTHON_SET_INTERRUPT
944 // If the interpreter isn't evaluating any Python at the moment then return
945 // false to signal that this function didn't handle the interrupt and the
946 // next component should try handling it.
947 if (!IsExecutingPython())
948 return false;
949
950 // Tell Python that it should pretend to have received a SIGINT.
951 PyErr_SetInterrupt();
952 // PyErr_SetInterrupt has no way to return an error so we can only pretend the
953 // signal got successfully handled and return true.
954 // Python 3.10 introduces PyErr_SetInterruptEx that could return an error, but
955 // the error handling is limited to checking the arguments which would be
956 // just our (hardcoded) input signal code SIGINT, so that's not useful at all.
957 return true;
958#else
959 Log *log = GetLog(LLDBLog::Script);
960
961 if (IsExecutingPython()) {
962 PyThreadState *state = PyThreadState_GET();
963 if (!state)
964 state = GetThreadState();
965 if (state) {
966 long tid = state->thread_id;
967 PyThreadState_Swap(state);
968 int num_threads = PyThreadState_SetAsyncExc(tid, PyExc_KeyboardInterrupt);
969 LLDB_LOGF(log,
970 "ScriptInterpreterPythonImpl::Interrupt() sending "
971 "PyExc_KeyboardInterrupt (tid = %li, num_threads = %i)...",
972 tid, num_threads);
973 return true;
974 }
975 }
976 LLDB_LOGF(log,
977 "ScriptInterpreterPythonImpl::Interrupt() python code not running, "
978 "can't interrupt");
979 return false;
980#endif
981}
982
983bool ScriptInterpreterPythonImpl::ExecuteOneLineWithReturn(
984 llvm::StringRef in_string, ScriptInterpreter::ScriptReturnType return_type,
985 void *ret_value, const ExecuteScriptOptions &options) {
986
987 llvm::Expected<std::unique_ptr<ScriptInterpreterIORedirect>>
988 io_redirect_or_error = ScriptInterpreterIORedirect::Create(
989 options.GetEnableIO(), m_debugger, /*result=*/nullptr);
990
991 if (!io_redirect_or_error) {
992 llvm::consumeError(io_redirect_or_error.takeError());
993 return false;
994 }
995
996 ScriptInterpreterIORedirect &io_redirect = **io_redirect_or_error;
997
998 Locker locker(this,
999 Locker::AcquireLock | Locker::InitSession |
1000 (options.GetSetLLDBGlobals() ? Locker::InitGlobals : 0) |
1001 Locker::NoSTDIN,
1002 Locker::FreeAcquiredLock | Locker::TearDownSession,
1003 io_redirect.GetInputFile(), io_redirect.GetOutputFile(),
1004 io_redirect.GetErrorFile());
1005
1006 PythonModule &main_module = GetMainModule();
1007 PythonDictionary globals = main_module.GetDictionary();
1008
1009 PythonDictionary locals = GetSessionDictionary();
1010 if (!locals.IsValid())
1011 locals = unwrapIgnoringErrors(
1012 As<PythonDictionary>(globals.GetAttribute(m_dictionary_name)));
1013 if (!locals.IsValid())
1014 locals = globals;
1015
1016 Expected<PythonObject> maybe_py_return =
1017 runStringOneLine(in_string, globals, locals);
1018
1019 if (!maybe_py_return) {
1020 llvm::handleAllErrors(
1021 maybe_py_return.takeError(),
1022 [&](PythonException &E) {
1023 E.Restore();
1024 if (options.GetMaskoutErrors()) {
1025 if (E.Matches(PyExc_SyntaxError)) {
1026 PyErr_Print();
1027 }
1028 PyErr_Clear();
1029 }
1030 },
1031 [](const llvm::ErrorInfoBase &E) {});
1032 return false;
1033 }
1034
1035 PythonObject py_return = std::move(maybe_py_return.get());
1036 assert(py_return.IsValid());
1037
1038 switch (return_type) {
1039 case eScriptReturnTypeCharPtr: // "char *"
1040 {
1041 const char format[3] = "s#";
1042 return PyArg_Parse(py_return.get(), format, (char **)ret_value);
1043 }
1044 case eScriptReturnTypeCharStrOrNone: // char* or NULL if py_return ==
1045 // Py_None
1046 {
1047 const char format[3] = "z";
1048 return PyArg_Parse(py_return.get(), format, (char **)ret_value);
1049 }
1050 case eScriptReturnTypeBool: {
1051 const char format[2] = "b";
1052 return PyArg_Parse(py_return.get(), format, (bool *)ret_value);
1053 }
1054 case eScriptReturnTypeShortInt: {
1055 const char format[2] = "h";
1056 return PyArg_Parse(py_return.get(), format, (short *)ret_value);
1057 }
1058 case eScriptReturnTypeShortIntUnsigned: {
1059 const char format[2] = "H";
1060 return PyArg_Parse(py_return.get(), format, (unsigned short *)ret_value);
1061 }
1062 case eScriptReturnTypeInt: {
1063 const char format[2] = "i";
1064 return PyArg_Parse(py_return.get(), format, (int *)ret_value);
1065 }
1066 case eScriptReturnTypeIntUnsigned: {
1067 const char format[2] = "I";
1068 return PyArg_Parse(py_return.get(), format, (unsigned int *)ret_value);
1069 }
1070 case eScriptReturnTypeLongInt: {
1071 const char format[2] = "l";
1072 return PyArg_Parse(py_return.get(), format, (long *)ret_value);
1073 }
1074 case eScriptReturnTypeLongIntUnsigned: {
1075 const char format[2] = "k";
1076 return PyArg_Parse(py_return.get(), format, (unsigned long *)ret_value);
1077 }
1078 case eScriptReturnTypeLongLong: {
1079 const char format[2] = "L";
1080 return PyArg_Parse(py_return.get(), format, (long long *)ret_value);
1081 }
1082 case eScriptReturnTypeLongLongUnsigned: {
1083 const char format[2] = "K";
1084 return PyArg_Parse(py_return.get(), format,
1085 (unsigned long long *)ret_value);
1086 }
1087 case eScriptReturnTypeFloat: {
1088 const char format[2] = "f";
1089 return PyArg_Parse(py_return.get(), format, (float *)ret_value);
1090 }
1091 case eScriptReturnTypeDouble: {
1092 const char format[2] = "d";
1093 return PyArg_Parse(py_return.get(), format, (double *)ret_value);
1094 }
1095 case eScriptReturnTypeChar: {
1096 const char format[2] = "c";
1097 return PyArg_Parse(py_return.get(), format, (char *)ret_value);
1098 }
1099 case eScriptReturnTypeOpaqueObject: {
1100 *((PyObject **)ret_value) = py_return.release();
1101 return true;
1102 }
1103 }
1104 llvm_unreachable("Fully covered switch!");
1105}
1106
1107Status ScriptInterpreterPythonImpl::ExecuteMultipleLines(
1108 const char *in_string, const ExecuteScriptOptions &options) {
1109
1110 if (in_string == nullptr)
1111 return Status();
1112
1113 llvm::Expected<std::unique_ptr<ScriptInterpreterIORedirect>>
1114 io_redirect_or_error = ScriptInterpreterIORedirect::Create(
1115 options.GetEnableIO(), m_debugger, /*result=*/nullptr);
1116
1117 if (!io_redirect_or_error)
1118 return Status::FromError(io_redirect_or_error.takeError());
1119
1120 ScriptInterpreterIORedirect &io_redirect = **io_redirect_or_error;
1121
1122 Locker locker(this,
1123 Locker::AcquireLock | Locker::InitSession |
1124 (options.GetSetLLDBGlobals() ? Locker::InitGlobals : 0) |
1125 Locker::NoSTDIN,
1126 Locker::FreeAcquiredLock | Locker::TearDownSession,
1127 io_redirect.GetInputFile(), io_redirect.GetOutputFile(),
1128 io_redirect.GetErrorFile());
1129
1130 PythonModule &main_module = GetMainModule();
1131 PythonDictionary globals = main_module.GetDictionary();
1132
1133 PythonDictionary locals = GetSessionDictionary();
1134 if (!locals.IsValid())
1135 locals = unwrapIgnoringErrors(
1136 As<PythonDictionary>(globals.GetAttribute(m_dictionary_name)));
1137 if (!locals.IsValid())
1138 locals = globals;
1139
1140 Expected<PythonObject> return_value =
1141 runStringMultiLine(in_string, globals, locals);
1142
1143 if (!return_value) {
1144 llvm::Error error =
1145 llvm::handleErrors(return_value.takeError(), [&](PythonException &E) {
1146 llvm::Error error = llvm::createStringError(
1147 llvm::inconvertibleErrorCode(), E.ReadBacktrace());
1148 if (!options.GetMaskoutErrors())
1149 E.Restore();
1150 return error;
1151 });
1152 return Status::FromError(std::move(error));
1153 }
1154
1155 return Status();
1156}
1157
1158void ScriptInterpreterPythonImpl::CollectDataForBreakpointCommandCallback(
1159 std::vector<std::reference_wrapper<BreakpointOptions>> &bp_options_vec,
1160 CommandReturnObject &result) {
1161 m_active_io_handler = eIOHandlerBreakpoint;
1162 m_debugger.GetCommandInterpreter().GetPythonCommandsFromIOHandler(
1163 " ", *this, &bp_options_vec);
1164}
1165
1166void ScriptInterpreterPythonImpl::CollectDataForWatchpointCommandCallback(
1167 WatchpointOptions *wp_options, CommandReturnObject &result) {
1168 m_active_io_handler = eIOHandlerWatchpoint;
1169 m_debugger.GetCommandInterpreter().GetPythonCommandsFromIOHandler(
1170 " ", *this, wp_options);
1171}
1172
1173Status ScriptInterpreterPythonImpl::SetBreakpointCommandCallbackFunction(
1174 BreakpointOptions &bp_options, const char *function_name,
1175 StructuredData::ObjectSP extra_args_sp) {
1176 Status error;
1177 // For now just cons up a oneliner that calls the provided function.
1178 std::string function_signature = function_name;
1179
1180 llvm::Expected<unsigned> maybe_args =
1181 GetMaxPositionalArgumentsForCallable(function_name);
1182 if (!maybe_args) {
1183 error = Status::FromErrorStringWithFormat(
1184 "could not get num args: %s",
1185 llvm::toString(maybe_args.takeError()).c_str());
1186 return error;
1187 }
1188 size_t max_args = *maybe_args;
1189
1190 bool uses_extra_args = false;
1191 if (max_args >= 4) {
1192 uses_extra_args = true;
1193 function_signature += "(frame, bp_loc, extra_args, internal_dict)";
1194 } else if (max_args >= 3) {
1195 if (extra_args_sp) {
1196 error = Status::FromErrorStringWithFormat(
1197 "cannot pass extra_args to a three argument callback");
1198 return error;
1199 }
1200 uses_extra_args = false;
1201 function_signature += "(frame, bp_loc, internal_dict)";
1202 } else {
1203 error = Status::FromErrorStringWithFormat("expected 3 or 4 argument "
1204 "function, %s can only take %zu",
1205 function_name, max_args);
1206 return error;
1207 }
1208
1209 SetBreakpointCommandCallback(bp_options, function_signature.c_str(),
1210 extra_args_sp, uses_extra_args,
1211 /*is_callback=*/true);
1212 return error;
1213}
1214
1215Status ScriptInterpreterPythonImpl::SetBreakpointCommandCallback(
1216 BreakpointOptions &bp_options,
1217 std::unique_ptr<BreakpointOptions::CommandData> &cmd_data_up) {
1218 Status error;
1219 error = GenerateBreakpointCommandCallbackData(cmd_data_up->user_source,
1220 cmd_data_up->script_source,
1221 /*has_extra_args=*/false,
1222 /*is_callback=*/false);
1223 if (error.Fail()) {
1224 return error;
1225 }
1226 auto baton_sp =
1227 std::make_shared<BreakpointOptions::CommandBaton>(std::move(cmd_data_up));
1228 bp_options.SetCallback(
1229 ScriptInterpreterPythonImpl::BreakpointCallbackFunction, baton_sp);
1230 return error;
1231}
1232
1233Status ScriptInterpreterPythonImpl::SetBreakpointCommandCallback(
1234 BreakpointOptions &bp_options, const char *command_body_text,
1235 bool is_callback) {
1236 return SetBreakpointCommandCallback(bp_options, command_body_text, {},
1237 /*uses_extra_args=*/false, is_callback);
1238}
1239
1240// Set a Python one-liner as the callback for the breakpoint.
1241Status ScriptInterpreterPythonImpl::SetBreakpointCommandCallback(
1242 BreakpointOptions &bp_options, const char *command_body_text,
1243 StructuredData::ObjectSP extra_args_sp, bool uses_extra_args,
1244 bool is_callback) {
1245 auto data_up = std::make_unique<CommandDataPython>(extra_args_sp);
1246 // Split the command_body_text into lines, and pass that to
1247 // GenerateBreakpointCommandCallbackData. That will wrap the body in an
1248 // auto-generated function, and return the function name in script_source.
1249 // That is what the callback will actually invoke.
1250
1251 data_up->user_source.SplitIntoLines(command_body_text);
1252 Status error = GenerateBreakpointCommandCallbackData(
1253 data_up->user_source, data_up->script_source, uses_extra_args,
1254 is_callback);
1255 if (error.Success()) {
1256 auto baton_sp =
1257 std::make_shared<BreakpointOptions::CommandBaton>(std::move(data_up));
1258 bp_options.SetCallback(
1259 ScriptInterpreterPythonImpl::BreakpointCallbackFunction, baton_sp);
1260 return error;
1261 }
1262 return error;
1263}
1264
1265// Set a Python one-liner as the callback for the watchpoint.
1266void ScriptInterpreterPythonImpl::SetWatchpointCommandCallback(
1267 WatchpointOptions *wp_options, const char *user_input, bool is_callback) {
1268 auto data_up = std::make_unique<WatchpointOptions::CommandData>();
1269
1270 // It's necessary to set both user_source and script_source to the oneliner.
1271 // The former is used to generate callback description (as in watchpoint
1272 // command list) while the latter is used for Python to interpret during the
1273 // actual callback.
1274
1275 data_up->user_source.AppendString(user_input);
1276 data_up->script_source.assign(user_input);
1277
1278 if (GenerateWatchpointCommandCallbackData(
1279 data_up->user_source, data_up->script_source, is_callback)) {
1280 auto baton_sp =
1281 std::make_shared<WatchpointOptions::CommandBaton>(std::move(data_up));
1282 wp_options->SetCallback(
1283 ScriptInterpreterPythonImpl::WatchpointCallbackFunction, baton_sp);
1284 }
1285}
1286
1287Status ScriptInterpreterPythonImpl::ExportFunctionDefinitionToInterpreter(
1288 StringList &function_def) {
1289 // Convert StringList to one long, newline delimited, const char *.
1290 std::string function_def_string(function_def.CopyList());
1291
1292 Status error = ExecuteMultipleLines(
1293 function_def_string.c_str(), ExecuteScriptOptions().SetEnableIO(false));
1294 return error;
1295}
1296
1297Status ScriptInterpreterPythonImpl::GenerateFunction(const char *signature,
1298 const StringList &input,
1299 bool is_callback) {
1300 Status error;
1301 int num_lines = input.GetSize();
1302 if (num_lines == 0) {
1303 error = Status::FromErrorString("No input data.");
1304 return error;
1305 }
1306
1307 if (!signature || *signature == 0) {
1308 error = Status::FromErrorString("No output function name.");
1309 return error;
1310 }
1311
1312 StreamString sstr;
1313 StringList auto_generated_function;
1314 auto_generated_function.AppendString(signature);
1315 auto_generated_function.AppendString(
1316 " global_dict = globals()"); // Grab the global dictionary
1317 auto_generated_function.AppendString(
1318 " new_keys = internal_dict.keys()"); // Make a list of keys in the
1319 // session dict
1320 auto_generated_function.AppendString(
1321 " old_keys = global_dict.keys()"); // Save list of keys in global dict
1322 auto_generated_function.AppendString(
1323 " global_dict.update(internal_dict)"); // Add the session dictionary
1324 // to the global dictionary.
1325
1326 if (is_callback) {
1327 // If the user input is a callback to a python function, make sure the input
1328 // is only 1 line, otherwise appending the user input would break the
1329 // generated wrapped function
1330 if (num_lines == 1) {
1331 sstr.Clear();
1332 sstr.Printf(" __return_val = %s", input.GetStringAtIndex(0));
1333 auto_generated_function.AppendString(sstr.GetData());
1334 } else {
1335 return Status::FromErrorString(
1336 "ScriptInterpreterPythonImpl::GenerateFunction(is_callback="
1337 "true) = ERROR: python function is multiline.");
1338 }
1339 } else {
1340 auto_generated_function.AppendString(
1341 " __return_val = None"); // Initialize user callback return value.
1342 auto_generated_function.AppendString(
1343 " def __user_code():"); // Create a nested function that will wrap
1344 // the user input. This is necessary to
1345 // capture the return value of the user input
1346 // and prevent early returns.
1347 for (int i = 0; i < num_lines; ++i) {
1348 sstr.Clear();
1349 sstr.Printf(" %s", input.GetStringAtIndex(i));
1350 auto_generated_function.AppendString(sstr.GetData());
1351 }
1352 auto_generated_function.AppendString(
1353 " __return_val = __user_code()"); // Call user code and capture
1354 // return value
1355 }
1356 auto_generated_function.AppendString(
1357 " for key in new_keys:"); // Iterate over all the keys from session
1358 // dict
1359 auto_generated_function.AppendString(
1360 " internal_dict[key] = global_dict[key]"); // Update session dict
1361 // values
1362 auto_generated_function.AppendString(
1363 " if key not in old_keys:"); // If key was not originally in
1364 // global dict
1365 auto_generated_function.AppendString(
1366 " del global_dict[key]"); // ...then remove key/value from
1367 // global dict
1368 auto_generated_function.AppendString(
1369 " return __return_val"); // Return the user callback return value.
1370
1371 // Verify that the results are valid Python.
1372 error = ExportFunctionDefinitionToInterpreter(auto_generated_function);
1373
1374 return error;
1375}
1376
1377bool ScriptInterpreterPythonImpl::GenerateTypeScriptFunction(
1378 StringList &user_input, std::string &output, const void *name_token) {
1379 static uint32_t num_created_functions = 0;
1380 user_input.RemoveBlankLines();
1381 StreamString sstr;
1382
1383 // Check to see if we have any data; if not, just return.
1384 if (user_input.GetSize() == 0)
1385 return false;
1386
1387 // Take what the user wrote, wrap it all up inside one big auto-generated
1388 // Python function, passing in the ValueObject as parameter to the function.
1389
1390 std::string auto_generated_function_name(
1391 GenerateUniqueName("lldb_autogen_python_type_print_func",
1392 num_created_functions, name_token));
1393 sstr.Printf("def %s (valobj, internal_dict):",
1394 auto_generated_function_name.c_str());
1395
1396 if (!GenerateFunction(sstr.GetData(), user_input, /*is_callback=*/false)
1397 .Success())
1398 return false;
1399
1400 // Store the name of the auto-generated function to be called.
1401 output.assign(auto_generated_function_name);
1402 return true;
1403}
1404
1405bool ScriptInterpreterPythonImpl::GenerateScriptAliasFunction(
1406 StringList &user_input, std::string &output) {
1407 static uint32_t num_created_functions = 0;
1408 user_input.RemoveBlankLines();
1409 StreamString sstr;
1410
1411 // Check to see if we have any data; if not, just return.
1412 if (user_input.GetSize() == 0)
1413 return false;
1414
1415 std::string auto_generated_function_name(GenerateUniqueName(
1416 "lldb_autogen_python_cmd_alias_func", num_created_functions));
1417
1418 sstr.Printf("def %s (debugger, args, exe_ctx, result, internal_dict):",
1419 auto_generated_function_name.c_str());
1420
1421 if (!GenerateFunction(sstr.GetData(), user_input, /*is_callback=*/false)
1422 .Success())
1423 return false;
1424
1425 // Store the name of the auto-generated function to be called.
1426 output.assign(auto_generated_function_name);
1427 return true;
1428}
1429
1430bool ScriptInterpreterPythonImpl::GenerateTypeSynthClass(
1431 StringList &user_input, std::string &output, const void *name_token) {
1432 static uint32_t num_created_classes = 0;
1433 user_input.RemoveBlankLines();
1434 int num_lines = user_input.GetSize();
1435 StreamString sstr;
1436
1437 // Check to see if we have any data; if not, just return.
1438 if (user_input.GetSize() == 0)
1439 return false;
1440
1441 // Wrap all user input into a Python class
1442
1443 std::string auto_generated_class_name(GenerateUniqueName(
1444 "lldb_autogen_python_type_synth_class", num_created_classes, name_token));
1445
1446 StringList auto_generated_class;
1447
1448 // Create the function name & definition string.
1449
1450 sstr.Printf("class %s:", auto_generated_class_name.c_str());
1451 auto_generated_class.AppendString(sstr.GetString());
1452
1453 // Wrap everything up inside the class, increasing the indentation. we don't
1454 // need to play any fancy indentation tricks here because there is no
1455 // surrounding code whose indentation we need to honor
1456 for (int i = 0; i < num_lines; ++i) {
1457 sstr.Clear();
1458 sstr.Printf(" %s", user_input.GetStringAtIndex(i));
1459 auto_generated_class.AppendString(sstr.GetString());
1460 }
1461
1462 // Verify that the results are valid Python. (even though the method is
1463 // ExportFunctionDefinitionToInterpreter, a class will actually be exported)
1464 // (TODO: rename that method to ExportDefinitionToInterpreter)
1465 if (!ExportFunctionDefinitionToInterpreter(auto_generated_class).Success())
1466 return false;
1467
1468 // Store the name of the auto-generated class
1469
1470 output.assign(auto_generated_class_name);
1471 return true;
1472}
1473
1475ScriptInterpreterPythonImpl::CreateFrameRecognizer(const char *class_name) {
1476 if (class_name == nullptr || class_name[0] == '\0')
1478
1479 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
1480 PythonObject ret_val = SWIGBridge::LLDBSWIGPython_CreateFrameRecognizer(
1481 class_name, m_dictionary_name.c_str());
1482
1484 new StructuredPythonObject(std::move(ret_val)));
1485}
1486
1487lldb::ValueObjectListSP ScriptInterpreterPythonImpl::GetRecognizedArguments(
1488 const StructuredData::ObjectSP &os_plugin_object_sp,
1489 lldb::StackFrameSP frame_sp) {
1490 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
1491
1492 if (!os_plugin_object_sp)
1493 return ValueObjectListSP();
1494
1495 StructuredData::Generic *generic = os_plugin_object_sp->GetAsGeneric();
1496 if (!generic)
1497 return nullptr;
1498
1499 PythonObject implementor(PyRefType::Borrowed,
1500 (PyObject *)generic->GetValue());
1501
1502 if (!implementor.IsAllocated())
1503 return ValueObjectListSP();
1504
1505 PythonObject py_return(PyRefType::Owned,
1506 SWIGBridge::LLDBSwigPython_GetRecognizedArguments(
1507 implementor.get(), frame_sp));
1508
1509 // if it fails, print the error but otherwise go on
1510 if (PyErr_Occurred()) {
1511 PyErr_Print();
1512 PyErr_Clear();
1513 }
1514 if (py_return.get()) {
1515 PythonList result_list(PyRefType::Borrowed, py_return.get());
1517 for (size_t i = 0; i < result_list.GetSize(); i++) {
1518 PyObject *item = result_list.GetItemAtIndex(i).get();
1519 lldb::SBValue *sb_value_ptr =
1520 (lldb::SBValue *)LLDBSWIGPython_CastPyObjectToSBValue(item);
1521 auto valobj_sp =
1522 SWIGBridge::LLDBSWIGPython_GetValueObjectSPFromSBValue(sb_value_ptr);
1523 if (valobj_sp)
1524 result->Append(valobj_sp);
1525 }
1526 return result;
1527 }
1528 return ValueObjectListSP();
1529}
1530
1531bool ScriptInterpreterPythonImpl::ShouldHide(
1532 const StructuredData::ObjectSP &os_plugin_object_sp,
1533 lldb::StackFrameSP frame_sp) {
1534 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
1535
1536 if (!os_plugin_object_sp)
1537 return false;
1538
1539 StructuredData::Generic *generic = os_plugin_object_sp->GetAsGeneric();
1540 if (!generic)
1541 return false;
1542
1543 PythonObject implementor(PyRefType::Borrowed,
1544 (PyObject *)generic->GetValue());
1545
1546 if (!implementor.IsAllocated())
1547 return false;
1548
1549 bool result =
1550 SWIGBridge::LLDBSwigPython_ShouldHide(implementor.get(), frame_sp);
1551
1552 // if it fails, print the error but otherwise go on
1553 if (PyErr_Occurred()) {
1554 PyErr_Print();
1555 PyErr_Clear();
1556 }
1557 return result;
1558}
1559
1561ScriptInterpreterPythonImpl::CreateScriptedProcessInterface() {
1562 return std::make_unique<ScriptedProcessPythonInterface>(*this);
1563}
1564
1566ScriptInterpreterPythonImpl::CreateScriptedStopHookInterface() {
1567 return std::make_shared<ScriptedStopHookPythonInterface>(*this);
1568}
1569
1571ScriptInterpreterPythonImpl::CreateScriptedThreadInterface() {
1572 return std::make_shared<ScriptedThreadPythonInterface>(*this);
1573}
1574
1576ScriptInterpreterPythonImpl::CreateScriptedThreadPlanInterface() {
1577 return std::make_shared<ScriptedThreadPlanPythonInterface>(*this);
1578}
1579
1581ScriptInterpreterPythonImpl::CreateOperatingSystemInterface() {
1582 return std::make_shared<OperatingSystemPythonInterface>(*this);
1583}
1584
1586ScriptInterpreterPythonImpl::CreateStructuredDataFromScriptObject(
1587 ScriptObject obj) {
1588 void *ptr = const_cast<void *>(obj.GetPointer());
1589 PythonObject py_obj(PyRefType::Borrowed, static_cast<PyObject *>(ptr));
1590 if (!py_obj.IsValid() || py_obj.IsNone())
1591 return {};
1592 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
1593 return py_obj.CreateStructuredObject();
1594}
1595
1597ScriptInterpreterPythonImpl::CreateScriptedBreakpointResolver(
1598 const char *class_name, const StructuredDataImpl &args_data,
1599 lldb::BreakpointSP &bkpt_sp) {
1600
1601 if (class_name == nullptr || class_name[0] == '\0')
1603
1604 if (!bkpt_sp.get())
1606
1607 Debugger &debugger = bkpt_sp->GetTarget().GetDebugger();
1608 ScriptInterpreterPythonImpl *python_interpreter =
1609 GetPythonInterpreter(debugger);
1610
1611 if (!python_interpreter)
1613
1614 Locker py_lock(this,
1615 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
1616
1617 PythonObject ret_val =
1618 SWIGBridge::LLDBSwigPythonCreateScriptedBreakpointResolver(
1619 class_name, python_interpreter->m_dictionary_name.c_str(), args_data,
1620 bkpt_sp);
1621
1623 new StructuredPythonObject(std::move(ret_val)));
1624}
1625
1626bool ScriptInterpreterPythonImpl::ScriptedBreakpointResolverSearchCallback(
1627 StructuredData::GenericSP implementor_sp, SymbolContext *sym_ctx) {
1628 bool should_continue = false;
1629
1630 if (implementor_sp) {
1631 Locker py_lock(this,
1632 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
1633 should_continue = SWIGBridge::LLDBSwigPythonCallBreakpointResolver(
1634 implementor_sp->GetValue(), "__callback__", sym_ctx);
1635 if (PyErr_Occurred()) {
1636 PyErr_Print();
1637 PyErr_Clear();
1638 }
1639 }
1640 return should_continue;
1641}
1642
1644ScriptInterpreterPythonImpl::ScriptedBreakpointResolverSearchDepth(
1645 StructuredData::GenericSP implementor_sp) {
1646 int depth_as_int = lldb::eSearchDepthModule;
1647 if (implementor_sp) {
1648 Locker py_lock(this,
1649 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
1650 depth_as_int = SWIGBridge::LLDBSwigPythonCallBreakpointResolver(
1651 implementor_sp->GetValue(), "__get_depth__", nullptr);
1652 if (PyErr_Occurred()) {
1653 PyErr_Print();
1654 PyErr_Clear();
1655 }
1656 }
1657 if (depth_as_int == lldb::eSearchDepthInvalid)
1659
1660 if (depth_as_int <= lldb::kLastSearchDepthKind)
1661 return (lldb::SearchDepth)depth_as_int;
1663}
1664
1666ScriptInterpreterPythonImpl::LoadPluginModule(const FileSpec &file_spec,
1668 if (!FileSystem::Instance().Exists(file_spec)) {
1669 error = Status::FromErrorString("no such file");
1670 return StructuredData::ObjectSP();
1671 }
1672
1673 StructuredData::ObjectSP module_sp;
1674
1675 LoadScriptOptions load_script_options =
1677 if (LoadScriptingModule(file_spec.GetPath().c_str(), load_script_options,
1678 error, &module_sp))
1679 return module_sp;
1680
1681 return StructuredData::ObjectSP();
1682}
1683
1684StructuredData::DictionarySP ScriptInterpreterPythonImpl::GetDynamicSettings(
1685 StructuredData::ObjectSP plugin_module_sp, Target *target,
1686 const char *setting_name, lldb_private::Status &error) {
1687 if (!plugin_module_sp || !target || !setting_name || !setting_name[0])
1689 StructuredData::Generic *generic = plugin_module_sp->GetAsGeneric();
1690 if (!generic)
1692
1693 Locker py_lock(this,
1694 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
1695 TargetSP target_sp(target->shared_from_this());
1696
1697 auto setting = (PyObject *)SWIGBridge::LLDBSWIGPython_GetDynamicSetting(
1698 generic->GetValue(), setting_name, target_sp);
1699
1700 if (!setting)
1702
1703 PythonDictionary py_dict =
1704 unwrapIgnoringErrors(As<PythonDictionary>(Take<PythonObject>(setting)));
1705
1706 if (!py_dict)
1708
1709 return py_dict.CreateStructuredDictionary();
1710}
1711
1713ScriptInterpreterPythonImpl::CreateSyntheticScriptedProvider(
1714 const char *class_name, lldb::ValueObjectSP valobj) {
1715 if (class_name == nullptr || class_name[0] == '\0')
1716 return StructuredData::ObjectSP();
1717
1718 if (!valobj.get())
1719 return StructuredData::ObjectSP();
1720
1721 ExecutionContext exe_ctx(valobj->GetExecutionContextRef());
1722 Target *target = exe_ctx.GetTargetPtr();
1723
1724 if (!target)
1725 return StructuredData::ObjectSP();
1726
1727 Debugger &debugger = target->GetDebugger();
1728 ScriptInterpreterPythonImpl *python_interpreter =
1729 GetPythonInterpreter(debugger);
1730
1731 if (!python_interpreter)
1732 return StructuredData::ObjectSP();
1733
1734 Locker py_lock(this,
1735 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
1736 PythonObject ret_val = SWIGBridge::LLDBSwigPythonCreateSyntheticProvider(
1737 class_name, python_interpreter->m_dictionary_name.c_str(), valobj);
1738
1740 new StructuredPythonObject(std::move(ret_val)));
1741}
1742
1744ScriptInterpreterPythonImpl::CreateScriptCommandObject(const char *class_name) {
1745 DebuggerSP debugger_sp(m_debugger.shared_from_this());
1746
1747 if (class_name == nullptr || class_name[0] == '\0')
1749
1750 if (!debugger_sp.get())
1752
1753 Locker py_lock(this,
1754 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
1755 PythonObject ret_val = SWIGBridge::LLDBSwigPythonCreateCommandObject(
1756 class_name, m_dictionary_name.c_str(), debugger_sp);
1757
1758 if (ret_val.IsValid())
1760 new StructuredPythonObject(std::move(ret_val)));
1761 else
1762 return {};
1763}
1764
1765bool ScriptInterpreterPythonImpl::GenerateTypeScriptFunction(
1766 const char *oneliner, std::string &output, const void *name_token) {
1767 StringList input;
1768 input.SplitIntoLines(oneliner, strlen(oneliner));
1769 return GenerateTypeScriptFunction(input, output, name_token);
1770}
1771
1772bool ScriptInterpreterPythonImpl::GenerateTypeSynthClass(
1773 const char *oneliner, std::string &output, const void *name_token) {
1774 StringList input;
1775 input.SplitIntoLines(oneliner, strlen(oneliner));
1776 return GenerateTypeSynthClass(input, output, name_token);
1777}
1778
1779Status ScriptInterpreterPythonImpl::GenerateBreakpointCommandCallbackData(
1780 StringList &user_input, std::string &output, bool has_extra_args,
1781 bool is_callback) {
1782 static uint32_t num_created_functions = 0;
1783 user_input.RemoveBlankLines();
1784 StreamString sstr;
1785 Status error;
1786 if (user_input.GetSize() == 0) {
1787 error = Status::FromErrorString("No input data.");
1788 return error;
1789 }
1790
1791 std::string auto_generated_function_name(GenerateUniqueName(
1792 "lldb_autogen_python_bp_callback_func_", num_created_functions));
1793 if (has_extra_args)
1794 sstr.Printf("def %s (frame, bp_loc, extra_args, internal_dict):",
1795 auto_generated_function_name.c_str());
1796 else
1797 sstr.Printf("def %s (frame, bp_loc, internal_dict):",
1798 auto_generated_function_name.c_str());
1799
1800 error = GenerateFunction(sstr.GetData(), user_input, is_callback);
1801 if (!error.Success())
1802 return error;
1803
1804 // Store the name of the auto-generated function to be called.
1805 output.assign(auto_generated_function_name);
1806 return error;
1807}
1808
1809bool ScriptInterpreterPythonImpl::GenerateWatchpointCommandCallbackData(
1810 StringList &user_input, std::string &output, bool is_callback) {
1811 static uint32_t num_created_functions = 0;
1812 user_input.RemoveBlankLines();
1813 StreamString sstr;
1814
1815 if (user_input.GetSize() == 0)
1816 return false;
1817
1818 std::string auto_generated_function_name(GenerateUniqueName(
1819 "lldb_autogen_python_wp_callback_func_", num_created_functions));
1820 sstr.Printf("def %s (frame, wp, internal_dict):",
1821 auto_generated_function_name.c_str());
1822
1823 if (!GenerateFunction(sstr.GetData(), user_input, is_callback).Success())
1824 return false;
1825
1826 // Store the name of the auto-generated function to be called.
1827 output.assign(auto_generated_function_name);
1828 return true;
1829}
1830
1831bool ScriptInterpreterPythonImpl::GetScriptedSummary(
1832 const char *python_function_name, lldb::ValueObjectSP valobj,
1833 StructuredData::ObjectSP &callee_wrapper_sp,
1834 const TypeSummaryOptions &options, std::string &retval) {
1835
1837
1838 if (!valobj.get()) {
1839 retval.assign("<no object>");
1840 return false;
1841 }
1842
1843 void *old_callee = nullptr;
1844 StructuredData::Generic *generic = nullptr;
1845 if (callee_wrapper_sp) {
1846 generic = callee_wrapper_sp->GetAsGeneric();
1847 if (generic)
1848 old_callee = generic->GetValue();
1849 }
1850 void *new_callee = old_callee;
1851
1852 bool ret_val;
1853 if (python_function_name && *python_function_name) {
1854 {
1855 Locker py_lock(this, Locker::AcquireLock | Locker::InitSession |
1856 Locker::NoSTDIN);
1857 {
1858 TypeSummaryOptionsSP options_sp(new TypeSummaryOptions(options));
1859
1860 static Timer::Category func_cat("LLDBSwigPythonCallTypeScript");
1861 Timer scoped_timer(func_cat, "LLDBSwigPythonCallTypeScript");
1862 ret_val = SWIGBridge::LLDBSwigPythonCallTypeScript(
1863 python_function_name, GetSessionDictionary().get(), valobj,
1864 &new_callee, options_sp, retval);
1865 }
1866 }
1867 } else {
1868 retval.assign("<no function name>");
1869 return false;
1870 }
1871
1872 if (new_callee && old_callee != new_callee) {
1873 Locker py_lock(this,
1874 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
1875 callee_wrapper_sp = std::make_shared<StructuredPythonObject>(
1876 PythonObject(PyRefType::Borrowed, static_cast<PyObject *>(new_callee)));
1877 }
1878
1879 return ret_val;
1880}
1881
1882bool ScriptInterpreterPythonImpl::FormatterCallbackFunction(
1883 const char *python_function_name, TypeImplSP type_impl_sp) {
1884 Locker py_lock(this,
1885 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
1886 return SWIGBridge::LLDBSwigPythonFormatterCallbackFunction(
1887 python_function_name, m_dictionary_name.c_str(), type_impl_sp);
1888}
1889
1890bool ScriptInterpreterPythonImpl::BreakpointCallbackFunction(
1891 void *baton, StoppointCallbackContext *context, user_id_t break_id,
1892 user_id_t break_loc_id) {
1893 CommandDataPython *bp_option_data = (CommandDataPython *)baton;
1894 const char *python_function_name = bp_option_data->script_source.c_str();
1895
1896 if (!context)
1897 return true;
1898
1899 ExecutionContext exe_ctx(context->exe_ctx_ref);
1900 Target *target = exe_ctx.GetTargetPtr();
1901
1902 if (!target)
1903 return true;
1904
1905 Debugger &debugger = target->GetDebugger();
1906 ScriptInterpreterPythonImpl *python_interpreter =
1907 GetPythonInterpreter(debugger);
1908
1909 if (!python_interpreter)
1910 return true;
1911
1912 if (python_function_name && python_function_name[0]) {
1913 const StackFrameSP stop_frame_sp(exe_ctx.GetFrameSP());
1914 BreakpointSP breakpoint_sp = target->GetBreakpointByID(break_id);
1915 if (breakpoint_sp) {
1916 const BreakpointLocationSP bp_loc_sp(
1917 breakpoint_sp->FindLocationByID(break_loc_id));
1918
1919 if (stop_frame_sp && bp_loc_sp) {
1920 bool ret_val = true;
1921 {
1922 Locker py_lock(python_interpreter, Locker::AcquireLock |
1923 Locker::InitSession |
1924 Locker::NoSTDIN);
1925 Expected<bool> maybe_ret_val =
1926 SWIGBridge::LLDBSwigPythonBreakpointCallbackFunction(
1927 python_function_name,
1928 python_interpreter->m_dictionary_name.c_str(), stop_frame_sp,
1929 bp_loc_sp, bp_option_data->m_extra_args);
1930
1931 if (!maybe_ret_val) {
1932
1933 llvm::handleAllErrors(
1934 maybe_ret_val.takeError(),
1935 [&](PythonException &E) {
1936 debugger.GetErrorStream() << E.ReadBacktrace();
1937 },
1938 [&](const llvm::ErrorInfoBase &E) {
1939 debugger.GetErrorStream() << E.message();
1940 });
1941
1942 } else {
1943 ret_val = maybe_ret_val.get();
1944 }
1945 }
1946 return ret_val;
1947 }
1948 }
1949 }
1950 // We currently always true so we stop in case anything goes wrong when
1951 // trying to call the script function
1952 return true;
1953}
1954
1955bool ScriptInterpreterPythonImpl::WatchpointCallbackFunction(
1956 void *baton, StoppointCallbackContext *context, user_id_t watch_id) {
1957 WatchpointOptions::CommandData *wp_option_data =
1959 const char *python_function_name = wp_option_data->script_source.c_str();
1960
1961 if (!context)
1962 return true;
1963
1964 ExecutionContext exe_ctx(context->exe_ctx_ref);
1965 Target *target = exe_ctx.GetTargetPtr();
1966
1967 if (!target)
1968 return true;
1969
1970 Debugger &debugger = target->GetDebugger();
1971 ScriptInterpreterPythonImpl *python_interpreter =
1972 GetPythonInterpreter(debugger);
1973
1974 if (!python_interpreter)
1975 return true;
1976
1977 if (python_function_name && python_function_name[0]) {
1978 const StackFrameSP stop_frame_sp(exe_ctx.GetFrameSP());
1979 WatchpointSP wp_sp = target->GetWatchpointList().FindByID(watch_id);
1980 if (wp_sp) {
1981 if (stop_frame_sp && wp_sp) {
1982 bool ret_val = true;
1983 {
1984 Locker py_lock(python_interpreter, Locker::AcquireLock |
1985 Locker::InitSession |
1986 Locker::NoSTDIN);
1987 ret_val = SWIGBridge::LLDBSwigPythonWatchpointCallbackFunction(
1988 python_function_name,
1989 python_interpreter->m_dictionary_name.c_str(), stop_frame_sp,
1990 wp_sp);
1991 }
1992 return ret_val;
1993 }
1994 }
1995 }
1996 // We currently always true so we stop in case anything goes wrong when
1997 // trying to call the script function
1998 return true;
1999}
2000
2001size_t ScriptInterpreterPythonImpl::CalculateNumChildren(
2002 const StructuredData::ObjectSP &implementor_sp, uint32_t max) {
2003 if (!implementor_sp)
2004 return 0;
2005 StructuredData::Generic *generic = implementor_sp->GetAsGeneric();
2006 if (!generic)
2007 return 0;
2008 auto *implementor = static_cast<PyObject *>(generic->GetValue());
2009 if (!implementor)
2010 return 0;
2011
2012 size_t ret_val = 0;
2013
2014 {
2015 Locker py_lock(this,
2016 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
2017 ret_val = SWIGBridge::LLDBSwigPython_CalculateNumChildren(implementor, max);
2018 }
2019
2020 return ret_val;
2021}
2022
2023lldb::ValueObjectSP ScriptInterpreterPythonImpl::GetChildAtIndex(
2024 const StructuredData::ObjectSP &implementor_sp, uint32_t idx) {
2025 if (!implementor_sp)
2026 return lldb::ValueObjectSP();
2027
2028 StructuredData::Generic *generic = implementor_sp->GetAsGeneric();
2029 if (!generic)
2030 return lldb::ValueObjectSP();
2031 auto *implementor = static_cast<PyObject *>(generic->GetValue());
2032 if (!implementor)
2033 return lldb::ValueObjectSP();
2034
2035 lldb::ValueObjectSP ret_val;
2036 {
2037 Locker py_lock(this,
2038 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
2039 PyObject *child_ptr =
2040 SWIGBridge::LLDBSwigPython_GetChildAtIndex(implementor, idx);
2041 if (child_ptr != nullptr && child_ptr != Py_None) {
2042 lldb::SBValue *sb_value_ptr =
2043 (lldb::SBValue *)LLDBSWIGPython_CastPyObjectToSBValue(child_ptr);
2044 if (sb_value_ptr == nullptr)
2045 Py_XDECREF(child_ptr);
2046 else
2047 ret_val = SWIGBridge::LLDBSWIGPython_GetValueObjectSPFromSBValue(
2048 sb_value_ptr);
2049 } else {
2050 Py_XDECREF(child_ptr);
2051 }
2052 }
2053
2054 return ret_val;
2055}
2056
2057int ScriptInterpreterPythonImpl::GetIndexOfChildWithName(
2058 const StructuredData::ObjectSP &implementor_sp, const char *child_name) {
2059 if (!implementor_sp)
2060 return UINT32_MAX;
2061
2062 StructuredData::Generic *generic = implementor_sp->GetAsGeneric();
2063 if (!generic)
2064 return UINT32_MAX;
2065 auto *implementor = static_cast<PyObject *>(generic->GetValue());
2066 if (!implementor)
2067 return UINT32_MAX;
2068
2069 int ret_val = UINT32_MAX;
2070
2071 {
2072 Locker py_lock(this,
2073 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
2074 ret_val = SWIGBridge::LLDBSwigPython_GetIndexOfChildWithName(implementor,
2075 child_name);
2076 }
2077
2078 return ret_val;
2079}
2080
2081bool ScriptInterpreterPythonImpl::UpdateSynthProviderInstance(
2082 const StructuredData::ObjectSP &implementor_sp) {
2083 bool ret_val = false;
2084
2085 if (!implementor_sp)
2086 return ret_val;
2087
2088 StructuredData::Generic *generic = implementor_sp->GetAsGeneric();
2089 if (!generic)
2090 return ret_val;
2091 auto *implementor = static_cast<PyObject *>(generic->GetValue());
2092 if (!implementor)
2093 return ret_val;
2094
2095 {
2096 Locker py_lock(this,
2097 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
2098 ret_val =
2099 SWIGBridge::LLDBSwigPython_UpdateSynthProviderInstance(implementor);
2100 }
2101
2102 return ret_val;
2103}
2104
2105bool ScriptInterpreterPythonImpl::MightHaveChildrenSynthProviderInstance(
2106 const StructuredData::ObjectSP &implementor_sp) {
2107 bool ret_val = false;
2108
2109 if (!implementor_sp)
2110 return ret_val;
2111
2112 StructuredData::Generic *generic = implementor_sp->GetAsGeneric();
2113 if (!generic)
2114 return ret_val;
2115 auto *implementor = static_cast<PyObject *>(generic->GetValue());
2116 if (!implementor)
2117 return ret_val;
2118
2119 {
2120 Locker py_lock(this,
2121 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
2122 ret_val = SWIGBridge::LLDBSwigPython_MightHaveChildrenSynthProviderInstance(
2123 implementor);
2124 }
2125
2126 return ret_val;
2127}
2128
2129lldb::ValueObjectSP ScriptInterpreterPythonImpl::GetSyntheticValue(
2130 const StructuredData::ObjectSP &implementor_sp) {
2131 lldb::ValueObjectSP ret_val(nullptr);
2132
2133 if (!implementor_sp)
2134 return ret_val;
2135
2136 StructuredData::Generic *generic = implementor_sp->GetAsGeneric();
2137 if (!generic)
2138 return ret_val;
2139 auto *implementor = static_cast<PyObject *>(generic->GetValue());
2140 if (!implementor)
2141 return ret_val;
2142
2143 {
2144 Locker py_lock(this,
2145 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
2146 PyObject *child_ptr =
2147 SWIGBridge::LLDBSwigPython_GetValueSynthProviderInstance(implementor);
2148 if (child_ptr != nullptr && child_ptr != Py_None) {
2149 lldb::SBValue *sb_value_ptr =
2150 (lldb::SBValue *)LLDBSWIGPython_CastPyObjectToSBValue(child_ptr);
2151 if (sb_value_ptr == nullptr)
2152 Py_XDECREF(child_ptr);
2153 else
2154 ret_val = SWIGBridge::LLDBSWIGPython_GetValueObjectSPFromSBValue(
2155 sb_value_ptr);
2156 } else {
2157 Py_XDECREF(child_ptr);
2158 }
2159 }
2160
2161 return ret_val;
2162}
2163
2164ConstString ScriptInterpreterPythonImpl::GetSyntheticTypeName(
2165 const StructuredData::ObjectSP &implementor_sp) {
2166 Locker py_lock(this,
2167 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
2168
2169 if (!implementor_sp)
2170 return {};
2171
2172 StructuredData::Generic *generic = implementor_sp->GetAsGeneric();
2173 if (!generic)
2174 return {};
2175
2176 PythonObject implementor(PyRefType::Borrowed,
2177 (PyObject *)generic->GetValue());
2178 if (!implementor.IsAllocated())
2179 return {};
2180
2181 llvm::Expected<PythonObject> expected_py_return =
2182 implementor.CallMethod("get_type_name");
2183
2184 if (!expected_py_return) {
2185 llvm::consumeError(expected_py_return.takeError());
2186 return {};
2187 }
2188
2189 PythonObject py_return = std::move(expected_py_return.get());
2190 if (!py_return.IsAllocated() || !PythonString::Check(py_return.get()))
2191 return {};
2192
2193 PythonString type_name(PyRefType::Borrowed, py_return.get());
2194 return ConstString(type_name.GetString());
2195}
2196
2197bool ScriptInterpreterPythonImpl::RunScriptFormatKeyword(
2198 const char *impl_function, Process *process, std::string &output,
2199 Status &error) {
2200 bool ret_val;
2201 if (!process) {
2202 error = Status::FromErrorString("no process");
2203 return false;
2204 }
2205 if (!impl_function || !impl_function[0]) {
2206 error = Status::FromErrorString("no function to execute");
2207 return false;
2208 }
2209
2210 {
2211 Locker py_lock(this,
2212 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
2213 ret_val = SWIGBridge::LLDBSWIGPythonRunScriptKeywordProcess(
2214 impl_function, m_dictionary_name.c_str(), process->shared_from_this(),
2215 output);
2216 if (!ret_val)
2217 error = Status::FromErrorString("python script evaluation failed");
2218 }
2219 return ret_val;
2220}
2221
2222bool ScriptInterpreterPythonImpl::RunScriptFormatKeyword(
2223 const char *impl_function, Thread *thread, std::string &output,
2224 Status &error) {
2225 if (!thread) {
2226 error = Status::FromErrorString("no thread");
2227 return false;
2228 }
2229 if (!impl_function || !impl_function[0]) {
2230 error = Status::FromErrorString("no function to execute");
2231 return false;
2232 }
2233
2234 Locker py_lock(this,
2235 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
2236 if (std::optional<std::string> result =
2237 SWIGBridge::LLDBSWIGPythonRunScriptKeywordThread(
2238 impl_function, m_dictionary_name.c_str(),
2239 thread->shared_from_this())) {
2240 output = std::move(*result);
2241 return true;
2242 }
2243 error = Status::FromErrorString("python script evaluation failed");
2244 return false;
2245}
2246
2247bool ScriptInterpreterPythonImpl::RunScriptFormatKeyword(
2248 const char *impl_function, Target *target, std::string &output,
2249 Status &error) {
2250 bool ret_val;
2251 if (!target) {
2252 error = Status::FromErrorString("no thread");
2253 return false;
2254 }
2255 if (!impl_function || !impl_function[0]) {
2256 error = Status::FromErrorString("no function to execute");
2257 return false;
2258 }
2259
2260 {
2261 TargetSP target_sp(target->shared_from_this());
2262 Locker py_lock(this,
2263 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
2264 ret_val = SWIGBridge::LLDBSWIGPythonRunScriptKeywordTarget(
2265 impl_function, m_dictionary_name.c_str(), target_sp, output);
2266 if (!ret_val)
2267 error = Status::FromErrorString("python script evaluation failed");
2268 }
2269 return ret_val;
2270}
2271
2272bool ScriptInterpreterPythonImpl::RunScriptFormatKeyword(
2273 const char *impl_function, StackFrame *frame, std::string &output,
2274 Status &error) {
2275 if (!frame) {
2276 error = Status::FromErrorString("no frame");
2277 return false;
2278 }
2279 if (!impl_function || !impl_function[0]) {
2280 error = Status::FromErrorString("no function to execute");
2281 return false;
2282 }
2283
2284 Locker py_lock(this,
2285 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
2286 if (std::optional<std::string> result =
2287 SWIGBridge::LLDBSWIGPythonRunScriptKeywordFrame(
2288 impl_function, m_dictionary_name.c_str(),
2289 frame->shared_from_this())) {
2290 output = std::move(*result);
2291 return true;
2292 }
2293 error = Status::FromErrorString("python script evaluation failed");
2294 return false;
2295}
2296
2297bool ScriptInterpreterPythonImpl::RunScriptFormatKeyword(
2298 const char *impl_function, ValueObject *value, std::string &output,
2299 Status &error) {
2300 bool ret_val;
2301 if (!value) {
2302 error = Status::FromErrorString("no value");
2303 return false;
2304 }
2305 if (!impl_function || !impl_function[0]) {
2306 error = Status::FromErrorString("no function to execute");
2307 return false;
2308 }
2309
2310 {
2311 Locker py_lock(this,
2312 Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN);
2313 ret_val = SWIGBridge::LLDBSWIGPythonRunScriptKeywordValue(
2314 impl_function, m_dictionary_name.c_str(), value->GetSP(), output);
2315 if (!ret_val)
2316 error = Status::FromErrorString("python script evaluation failed");
2317 }
2318 return ret_val;
2319}
2320
2321uint64_t replace_all(std::string &str, const std::string &oldStr,
2322 const std::string &newStr) {
2323 size_t pos = 0;
2324 uint64_t matches = 0;
2325 while ((pos = str.find(oldStr, pos)) != std::string::npos) {
2326 matches++;
2327 str.replace(pos, oldStr.length(), newStr);
2328 pos += newStr.length();
2329 }
2330 return matches;
2331}
2332
2333bool ScriptInterpreterPythonImpl::LoadScriptingModule(
2334 const char *pathname, const LoadScriptOptions &options,
2336 FileSpec extra_search_dir) {
2337 namespace fs = llvm::sys::fs;
2338 namespace path = llvm::sys::path;
2339
2341 .SetEnableIO(!options.GetSilent())
2342 .SetSetLLDBGlobals(false);
2343
2344 if (!pathname || !pathname[0]) {
2345 error = Status::FromErrorString("empty path");
2346 return false;
2347 }
2348
2349 llvm::Expected<std::unique_ptr<ScriptInterpreterIORedirect>>
2350 io_redirect_or_error = ScriptInterpreterIORedirect::Create(
2351 exc_options.GetEnableIO(), m_debugger, /*result=*/nullptr);
2352
2353 if (!io_redirect_or_error) {
2354 error = Status::FromError(io_redirect_or_error.takeError());
2355 return false;
2356 }
2357
2358 ScriptInterpreterIORedirect &io_redirect = **io_redirect_or_error;
2359
2360 // Before executing Python code, lock the GIL.
2361 Locker py_lock(this,
2362 Locker::AcquireLock |
2363 (options.GetInitSession() ? Locker::InitSession : 0) |
2364 Locker::NoSTDIN,
2365 Locker::FreeAcquiredLock |
2366 (options.GetInitSession() ? Locker::TearDownSession : 0),
2367 io_redirect.GetInputFile(), io_redirect.GetOutputFile(),
2368 io_redirect.GetErrorFile());
2369
2370 auto ExtendSysPath = [&](std::string directory) -> llvm::Error {
2371 if (directory.empty()) {
2372 return llvm::createStringError("invalid directory name");
2373 }
2374
2375 replace_all(directory, "\\", "\\\\");
2376 replace_all(directory, "'", "\\'");
2377
2378 // Make sure that Python has "directory" in the search path.
2379 StreamString command_stream;
2380 command_stream.Printf("if not (sys.path.__contains__('%s')):\n "
2381 "sys.path.insert(1,'%s');\n\n",
2382 directory.c_str(), directory.c_str());
2383 bool syspath_retval =
2384 ExecuteMultipleLines(command_stream.GetData(), exc_options).Success();
2385 if (!syspath_retval)
2386 return llvm::createStringError("Python sys.path handling failed");
2387
2388 return llvm::Error::success();
2389 };
2390
2391 std::string module_name(pathname);
2392 bool possible_package = false;
2393
2394 if (extra_search_dir) {
2395 if (llvm::Error e = ExtendSysPath(extra_search_dir.GetPath())) {
2396 error = Status::FromError(std::move(e));
2397 return false;
2398 }
2399 } else {
2400 FileSpec module_file(pathname);
2401 FileSystem::Instance().Resolve(module_file);
2402
2403 fs::file_status st;
2404 std::error_code ec = status(module_file.GetPath(), st);
2405
2406 if (ec || st.type() == fs::file_type::status_error ||
2407 st.type() == fs::file_type::type_unknown ||
2408 st.type() == fs::file_type::file_not_found) {
2409 // if not a valid file of any sort, check if it might be a filename still
2410 // dot can't be used but / and \ can, and if either is found, reject
2411 if (strchr(pathname, '\\') || strchr(pathname, '/')) {
2412 error = Status::FromErrorStringWithFormatv("invalid pathname '{0}'",
2413 pathname);
2414 return false;
2415 }
2416 // Not a filename, probably a package of some sort, let it go through.
2417 possible_package = true;
2418 } else if (is_directory(st) || is_regular_file(st)) {
2419 if (module_file.GetDirectory().IsEmpty()) {
2420 error = Status::FromErrorStringWithFormatv(
2421 "invalid directory name '{0}'", pathname);
2422 return false;
2423 }
2424 if (llvm::Error e =
2425 ExtendSysPath(module_file.GetDirectory().GetCString())) {
2426 error = Status::FromError(std::move(e));
2427 return false;
2428 }
2429 module_name = module_file.GetFilename().GetCString();
2430 } else {
2431 error = Status::FromErrorString(
2432 "no known way to import this module specification");
2433 return false;
2434 }
2435 }
2436
2437 // Strip .py or .pyc extension
2438 llvm::StringRef extension = llvm::sys::path::extension(module_name);
2439 if (!extension.empty()) {
2440 if (extension == ".py")
2441 module_name.resize(module_name.length() - 3);
2442 else if (extension == ".pyc")
2443 module_name.resize(module_name.length() - 4);
2444 }
2445
2446 if (!possible_package && module_name.find('.') != llvm::StringRef::npos) {
2447 error = Status::FromErrorStringWithFormat(
2448 "Python does not allow dots in module names: %s", module_name.c_str());
2449 return false;
2450 }
2451
2452 if (module_name.find('-') != llvm::StringRef::npos) {
2453 error = Status::FromErrorStringWithFormat(
2454 "Python discourages dashes in module names: %s", module_name.c_str());
2455 return false;
2456 }
2457
2458 // Check if the module is already imported.
2459 StreamString command_stream;
2460 command_stream.Clear();
2461 command_stream.Printf("sys.modules.__contains__('%s')", module_name.c_str());
2462 bool does_contain = false;
2463 // This call will succeed if the module was ever imported in any Debugger in
2464 // the lifetime of the process in which this LLDB framework is living.
2465 const bool does_contain_executed = ExecuteOneLineWithReturn(
2466 command_stream.GetData(),
2467 ScriptInterpreterPythonImpl::eScriptReturnTypeBool, &does_contain,
2468 exc_options);
2469
2470 const bool was_imported_globally = does_contain_executed && does_contain;
2471 const bool was_imported_locally =
2472 GetSessionDictionary()
2473 .GetItemForKey(PythonString(module_name))
2474 .IsAllocated();
2475
2476 // now actually do the import
2477 command_stream.Clear();
2478
2479 if (was_imported_globally || was_imported_locally) {
2480 if (!was_imported_locally)
2481 command_stream.Printf("import %s ; reload_module(%s)",
2482 module_name.c_str(), module_name.c_str());
2483 else
2484 command_stream.Printf("reload_module(%s)", module_name.c_str());
2485 } else
2486 command_stream.Printf("import %s", module_name.c_str());
2487
2488 error = ExecuteMultipleLines(command_stream.GetData(), exc_options);
2489 if (error.Fail())
2490 return false;
2491
2492 // if we are here, everything worked
2493 // call __lldb_init_module(debugger,dict)
2494 if (!SWIGBridge::LLDBSwigPythonCallModuleInit(
2495 module_name.c_str(), m_dictionary_name.c_str(),
2496 m_debugger.shared_from_this())) {
2497 error = Status::FromErrorString("calling __lldb_init_module failed");
2498 return false;
2499 }
2500
2501 if (module_sp) {
2502 // everything went just great, now set the module object
2503 command_stream.Clear();
2504 command_stream.Printf("%s", module_name.c_str());
2505 void *module_pyobj = nullptr;
2506 if (ExecuteOneLineWithReturn(
2507 command_stream.GetData(),
2508 ScriptInterpreter::eScriptReturnTypeOpaqueObject, &module_pyobj,
2509 exc_options) &&
2510 module_pyobj)
2511 *module_sp = std::make_shared<StructuredPythonObject>(PythonObject(
2512 PyRefType::Owned, static_cast<PyObject *>(module_pyobj)));
2513 }
2514
2515 return true;
2516}
2517
2518bool ScriptInterpreterPythonImpl::IsReservedWord(const char *word) {
2519 if (!word || !word[0])
2520 return false;
2521
2522 llvm::StringRef word_sr(word);
2523
2524 // filter out a few characters that would just confuse us and that are
2525 // clearly not keyword material anyway
2526 if (word_sr.find('"') != llvm::StringRef::npos ||
2527 word_sr.find('\'') != llvm::StringRef::npos)
2528 return false;
2529
2530 StreamString command_stream;
2531 command_stream.Printf("keyword.iskeyword('%s')", word);
2532 bool result;
2533 ExecuteScriptOptions options;
2534 options.SetEnableIO(false);
2535 options.SetMaskoutErrors(true);
2536 options.SetSetLLDBGlobals(false);
2537 if (ExecuteOneLineWithReturn(command_stream.GetData(),
2538 ScriptInterpreter::eScriptReturnTypeBool,
2539 &result, options))
2540 return result;
2541 return false;
2542}
2543
2544ScriptInterpreterPythonImpl::SynchronicityHandler::SynchronicityHandler(
2546 : m_debugger_sp(debugger_sp), m_synch_wanted(synchro),
2547 m_old_asynch(debugger_sp->GetAsyncExecution()) {
2548 if (m_synch_wanted == eScriptedCommandSynchronicitySynchronous)
2549 m_debugger_sp->SetAsyncExecution(false);
2550 else if (m_synch_wanted == eScriptedCommandSynchronicityAsynchronous)
2551 m_debugger_sp->SetAsyncExecution(true);
2552}
2553
2554ScriptInterpreterPythonImpl::SynchronicityHandler::~SynchronicityHandler() {
2555 if (m_synch_wanted != eScriptedCommandSynchronicityCurrentValue)
2556 m_debugger_sp->SetAsyncExecution(m_old_asynch);
2557}
2558
2559bool ScriptInterpreterPythonImpl::RunScriptBasedCommand(
2560 const char *impl_function, llvm::StringRef args,
2561 ScriptedCommandSynchronicity synchronicity,
2563 const lldb_private::ExecutionContext &exe_ctx) {
2564 if (!impl_function) {
2565 error = Status::FromErrorString("no function to execute");
2566 return false;
2567 }
2568
2569 lldb::DebuggerSP debugger_sp = m_debugger.shared_from_this();
2570 lldb::ExecutionContextRefSP exe_ctx_ref_sp(new ExecutionContextRef(exe_ctx));
2571
2572 if (!debugger_sp.get()) {
2573 error = Status::FromErrorString("invalid Debugger pointer");
2574 return false;
2575 }
2576
2577 bool ret_val = false;
2578
2579 std::string err_msg;
2580
2581 {
2582 Locker py_lock(this,
2583 Locker::AcquireLock | Locker::InitSession |
2584 (cmd_retobj.GetInteractive() ? 0 : Locker::NoSTDIN),
2585 Locker::FreeLock | Locker::TearDownSession);
2586
2587 SynchronicityHandler synch_handler(debugger_sp, synchronicity);
2588
2589 std::string args_str = args.str();
2590 ret_val = SWIGBridge::LLDBSwigPythonCallCommand(
2591 impl_function, m_dictionary_name.c_str(), debugger_sp, args_str.c_str(),
2592 cmd_retobj, exe_ctx_ref_sp);
2593 }
2594
2595 if (!ret_val)
2596 error = Status::FromErrorString("unable to execute script function");
2597 else if (cmd_retobj.GetStatus() == eReturnStatusFailed)
2598 return false;
2599
2600 error.Clear();
2601 return ret_val;
2602}
2603
2604bool ScriptInterpreterPythonImpl::RunScriptBasedCommand(
2605 StructuredData::GenericSP impl_obj_sp, llvm::StringRef args,
2606 ScriptedCommandSynchronicity synchronicity,
2608 const lldb_private::ExecutionContext &exe_ctx) {
2609 if (!impl_obj_sp || !impl_obj_sp->IsValid()) {
2610 error = Status::FromErrorString("no function to execute");
2611 return false;
2612 }
2613
2614 lldb::DebuggerSP debugger_sp = m_debugger.shared_from_this();
2615 lldb::ExecutionContextRefSP exe_ctx_ref_sp(new ExecutionContextRef(exe_ctx));
2616
2617 if (!debugger_sp.get()) {
2618 error = Status::FromErrorString("invalid Debugger pointer");
2619 return false;
2620 }
2621
2622 bool ret_val = false;
2623
2624 std::string err_msg;
2625
2626 {
2627 Locker py_lock(this,
2628 Locker::AcquireLock | Locker::InitSession |
2629 (cmd_retobj.GetInteractive() ? 0 : Locker::NoSTDIN),
2630 Locker::FreeLock | Locker::TearDownSession);
2631
2632 SynchronicityHandler synch_handler(debugger_sp, synchronicity);
2633
2634 std::string args_str = args.str();
2635 ret_val = SWIGBridge::LLDBSwigPythonCallCommandObject(
2636 static_cast<PyObject *>(impl_obj_sp->GetValue()), debugger_sp,
2637 args_str.c_str(), cmd_retobj, exe_ctx_ref_sp);
2638 }
2639
2640 if (!ret_val)
2641 error = Status::FromErrorString("unable to execute script function");
2642 else if (cmd_retobj.GetStatus() == eReturnStatusFailed)
2643 return false;
2644
2645 error.Clear();
2646 return ret_val;
2647}
2648
2649bool ScriptInterpreterPythonImpl::RunScriptBasedParsedCommand(
2650 StructuredData::GenericSP impl_obj_sp, Args &args,
2651 ScriptedCommandSynchronicity synchronicity,
2653 const lldb_private::ExecutionContext &exe_ctx) {
2654 if (!impl_obj_sp || !impl_obj_sp->IsValid()) {
2655 error = Status::FromErrorString("no function to execute");
2656 return false;
2657 }
2658
2659 lldb::DebuggerSP debugger_sp = m_debugger.shared_from_this();
2660 lldb::ExecutionContextRefSP exe_ctx_ref_sp(new ExecutionContextRef(exe_ctx));
2661
2662 if (!debugger_sp.get()) {
2663 error = Status::FromErrorString("invalid Debugger pointer");
2664 return false;
2665 }
2666
2667 bool ret_val = false;
2668
2669 std::string err_msg;
2670
2671 {
2672 Locker py_lock(this,
2673 Locker::AcquireLock | Locker::InitSession |
2674 (cmd_retobj.GetInteractive() ? 0 : Locker::NoSTDIN),
2675 Locker::FreeLock | Locker::TearDownSession);
2676
2677 SynchronicityHandler synch_handler(debugger_sp, synchronicity);
2678
2680
2681 for (const Args::ArgEntry &entry : args) {
2682 args_arr_sp->AddStringItem(entry.ref());
2683 }
2684 StructuredDataImpl args_impl(args_arr_sp);
2685
2686 ret_val = SWIGBridge::LLDBSwigPythonCallParsedCommandObject(
2687 static_cast<PyObject *>(impl_obj_sp->GetValue()), debugger_sp,
2688 args_impl, cmd_retobj, exe_ctx_ref_sp);
2689 }
2690
2691 if (!ret_val)
2692 error = Status::FromErrorString("unable to execute script function");
2693 else if (cmd_retobj.GetStatus() == eReturnStatusFailed)
2694 return false;
2695
2696 error.Clear();
2697 return ret_val;
2698}
2699
2700std::optional<std::string>
2701ScriptInterpreterPythonImpl::GetRepeatCommandForScriptedCommand(
2702 StructuredData::GenericSP impl_obj_sp, Args &args) {
2703 if (!impl_obj_sp || !impl_obj_sp->IsValid())
2704 return std::nullopt;
2705
2706 lldb::DebuggerSP debugger_sp = m_debugger.shared_from_this();
2707
2708 if (!debugger_sp.get())
2709 return std::nullopt;
2710
2711 std::optional<std::string> ret_val;
2712
2713 {
2714 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN,
2715 Locker::FreeLock);
2716
2718
2719 // For scripting commands, we send the command string:
2720 std::string command;
2721 args.GetQuotedCommandString(command);
2722 ret_val = SWIGBridge::LLDBSwigPythonGetRepeatCommandForScriptedCommand(
2723 static_cast<PyObject *>(impl_obj_sp->GetValue()), command);
2724 }
2725 return ret_val;
2726}
2727
2729ScriptInterpreterPythonImpl::HandleArgumentCompletionForScriptedCommand(
2730 StructuredData::GenericSP impl_obj_sp, std::vector<llvm::StringRef> &args,
2731 size_t args_pos, size_t char_in_arg) {
2732 StructuredData::DictionarySP completion_dict_sp;
2733 if (!impl_obj_sp || !impl_obj_sp->IsValid())
2734 return completion_dict_sp;
2735
2736 {
2737 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN,
2738 Locker::FreeLock);
2739
2740 completion_dict_sp =
2741 SWIGBridge::LLDBSwigPythonHandleArgumentCompletionForScriptedCommand(
2742 static_cast<PyObject *>(impl_obj_sp->GetValue()), args, args_pos,
2743 char_in_arg);
2744 }
2745 return completion_dict_sp;
2746}
2747
2749ScriptInterpreterPythonImpl::HandleOptionArgumentCompletionForScriptedCommand(
2750 StructuredData::GenericSP impl_obj_sp, llvm::StringRef &long_option,
2751 size_t char_in_arg) {
2752 StructuredData::DictionarySP completion_dict_sp;
2753 if (!impl_obj_sp || !impl_obj_sp->IsValid())
2754 return completion_dict_sp;
2755
2756 {
2757 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN,
2758 Locker::FreeLock);
2759
2760 completion_dict_sp = SWIGBridge::
2761 LLDBSwigPythonHandleOptionArgumentCompletionForScriptedCommand(
2762 static_cast<PyObject *>(impl_obj_sp->GetValue()), long_option,
2763 char_in_arg);
2764 }
2765 return completion_dict_sp;
2766}
2767
2768/// In Python, a special attribute __doc__ contains the docstring for an object
2769/// (function, method, class, ...) if any is defined Otherwise, the attribute's
2770/// value is None.
2771bool ScriptInterpreterPythonImpl::GetDocumentationForItem(const char *item,
2772 std::string &dest) {
2773 dest.clear();
2774
2775 if (!item || !*item)
2776 return false;
2777
2778 std::string command(item);
2779 command += ".__doc__";
2780
2781 // Python is going to point this to valid data if ExecuteOneLineWithReturn
2782 // returns successfully.
2783 char *result_ptr = nullptr;
2784
2785 if (ExecuteOneLineWithReturn(
2786 command, ScriptInterpreter::eScriptReturnTypeCharStrOrNone,
2787 &result_ptr, ExecuteScriptOptions().SetEnableIO(false))) {
2788 if (result_ptr)
2789 dest.assign(result_ptr);
2790 return true;
2791 }
2792
2793 StreamString str_stream;
2794 str_stream << "Function " << item
2795 << " was not found. Containing module might be missing.";
2796 dest = std::string(str_stream.GetString());
2797
2798 return false;
2799}
2800
2801bool ScriptInterpreterPythonImpl::GetShortHelpForCommandObject(
2802 StructuredData::GenericSP cmd_obj_sp, std::string &dest) {
2803 dest.clear();
2804
2805 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
2806
2807 if (!cmd_obj_sp)
2808 return false;
2809
2810 PythonObject implementor(PyRefType::Borrowed,
2811 (PyObject *)cmd_obj_sp->GetValue());
2812
2813 if (!implementor.IsAllocated())
2814 return false;
2815
2816 llvm::Expected<PythonObject> expected_py_return =
2817 implementor.CallMethod("get_short_help");
2818
2819 if (!expected_py_return) {
2820 llvm::consumeError(expected_py_return.takeError());
2821 return false;
2822 }
2823
2824 PythonObject py_return = std::move(expected_py_return.get());
2825
2826 if (py_return.IsAllocated() && PythonString::Check(py_return.get())) {
2827 PythonString py_string(PyRefType::Borrowed, py_return.get());
2828 llvm::StringRef return_data(py_string.GetString());
2829 dest.assign(return_data.data(), return_data.size());
2830 return true;
2831 }
2832
2833 return false;
2834}
2835
2836uint32_t ScriptInterpreterPythonImpl::GetFlagsForCommandObject(
2837 StructuredData::GenericSP cmd_obj_sp) {
2838 uint32_t result = 0;
2839
2840 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
2841
2842 static char callee_name[] = "get_flags";
2843
2844 if (!cmd_obj_sp)
2845 return result;
2846
2847 PythonObject implementor(PyRefType::Borrowed,
2848 (PyObject *)cmd_obj_sp->GetValue());
2849
2850 if (!implementor.IsAllocated())
2851 return result;
2852
2853 PythonObject pmeth(PyRefType::Owned,
2854 PyObject_GetAttrString(implementor.get(), callee_name));
2855
2856 if (PyErr_Occurred())
2857 PyErr_Clear();
2858
2859 if (!pmeth.IsAllocated())
2860 return result;
2861
2862 if (PyCallable_Check(pmeth.get()) == 0) {
2863 if (PyErr_Occurred())
2864 PyErr_Clear();
2865 return result;
2866 }
2867
2868 if (PyErr_Occurred())
2869 PyErr_Clear();
2870
2871 long long py_return = unwrapOrSetPythonException(
2872 As<long long>(implementor.CallMethod(callee_name)));
2873
2874 // if it fails, print the error but otherwise go on
2875 if (PyErr_Occurred()) {
2876 PyErr_Print();
2877 PyErr_Clear();
2878 } else {
2879 result = py_return;
2880 }
2881
2882 return result;
2883}
2884
2886ScriptInterpreterPythonImpl::GetOptionsForCommandObject(
2887 StructuredData::GenericSP cmd_obj_sp) {
2888 StructuredData::ObjectSP result = {};
2889
2890 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
2891
2892 static char callee_name[] = "get_options_definition";
2893
2894 if (!cmd_obj_sp)
2895 return result;
2896
2897 PythonObject implementor(PyRefType::Borrowed,
2898 (PyObject *)cmd_obj_sp->GetValue());
2899
2900 if (!implementor.IsAllocated())
2901 return result;
2902
2903 PythonObject pmeth(PyRefType::Owned,
2904 PyObject_GetAttrString(implementor.get(), callee_name));
2905
2906 if (PyErr_Occurred())
2907 PyErr_Clear();
2908
2909 if (!pmeth.IsAllocated())
2910 return result;
2911
2912 if (PyCallable_Check(pmeth.get()) == 0) {
2913 if (PyErr_Occurred())
2914 PyErr_Clear();
2915 return result;
2916 }
2917
2918 if (PyErr_Occurred())
2919 PyErr_Clear();
2920
2921 PythonDictionary py_return = unwrapOrSetPythonException(
2922 As<PythonDictionary>(implementor.CallMethod(callee_name)));
2923
2924 // if it fails, print the error but otherwise go on
2925 if (PyErr_Occurred()) {
2926 PyErr_Print();
2927 PyErr_Clear();
2928 return {};
2929 }
2930 return py_return.CreateStructuredObject();
2931}
2932
2934ScriptInterpreterPythonImpl::GetArgumentsForCommandObject(
2935 StructuredData::GenericSP cmd_obj_sp) {
2936 StructuredData::ObjectSP result = {};
2937
2938 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
2939
2940 static char callee_name[] = "get_args_definition";
2941
2942 if (!cmd_obj_sp)
2943 return result;
2944
2945 PythonObject implementor(PyRefType::Borrowed,
2946 (PyObject *)cmd_obj_sp->GetValue());
2947
2948 if (!implementor.IsAllocated())
2949 return result;
2950
2951 PythonObject pmeth(PyRefType::Owned,
2952 PyObject_GetAttrString(implementor.get(), callee_name));
2953
2954 if (PyErr_Occurred())
2955 PyErr_Clear();
2956
2957 if (!pmeth.IsAllocated())
2958 return result;
2959
2960 if (PyCallable_Check(pmeth.get()) == 0) {
2961 if (PyErr_Occurred())
2962 PyErr_Clear();
2963 return result;
2964 }
2965
2966 if (PyErr_Occurred())
2967 PyErr_Clear();
2968
2969 PythonList py_return = unwrapOrSetPythonException(
2970 As<PythonList>(implementor.CallMethod(callee_name)));
2971
2972 // if it fails, print the error but otherwise go on
2973 if (PyErr_Occurred()) {
2974 PyErr_Print();
2975 PyErr_Clear();
2976 return {};
2977 }
2978 return py_return.CreateStructuredObject();
2979}
2980
2981void ScriptInterpreterPythonImpl::OptionParsingStartedForCommandObject(
2982 StructuredData::GenericSP cmd_obj_sp) {
2983
2984 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
2985
2986 static char callee_name[] = "option_parsing_started";
2987
2988 if (!cmd_obj_sp)
2989 return;
2990
2991 PythonObject implementor(PyRefType::Borrowed,
2992 (PyObject *)cmd_obj_sp->GetValue());
2993
2994 if (!implementor.IsAllocated())
2995 return;
2996
2997 PythonObject pmeth(PyRefType::Owned,
2998 PyObject_GetAttrString(implementor.get(), callee_name));
2999
3000 if (PyErr_Occurred())
3001 PyErr_Clear();
3002
3003 if (!pmeth.IsAllocated())
3004 return;
3005
3006 if (PyCallable_Check(pmeth.get()) == 0) {
3007 if (PyErr_Occurred())
3008 PyErr_Clear();
3009 return;
3010 }
3011
3012 if (PyErr_Occurred())
3013 PyErr_Clear();
3014
3015 // option_parsing_starting doesn't return anything, ignore anything but
3016 // python errors.
3017 unwrapOrSetPythonException(As<bool>(implementor.CallMethod(callee_name)));
3018
3019 // if it fails, print the error but otherwise go on
3020 if (PyErr_Occurred()) {
3021 PyErr_Print();
3022 PyErr_Clear();
3023 return;
3024 }
3025}
3026
3027bool ScriptInterpreterPythonImpl::SetOptionValueForCommandObject(
3028 StructuredData::GenericSP cmd_obj_sp, ExecutionContext *exe_ctx,
3029 llvm::StringRef long_option, llvm::StringRef value) {
3030 StructuredData::ObjectSP result = {};
3031
3032 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
3033
3034 static char callee_name[] = "set_option_value";
3035
3036 if (!cmd_obj_sp)
3037 return false;
3038
3039 PythonObject implementor(PyRefType::Borrowed,
3040 (PyObject *)cmd_obj_sp->GetValue());
3041
3042 if (!implementor.IsAllocated())
3043 return false;
3044
3045 PythonObject pmeth(PyRefType::Owned,
3046 PyObject_GetAttrString(implementor.get(), callee_name));
3047
3048 if (PyErr_Occurred())
3049 PyErr_Clear();
3050
3051 if (!pmeth.IsAllocated())
3052 return false;
3053
3054 if (PyCallable_Check(pmeth.get()) == 0) {
3055 if (PyErr_Occurred())
3056 PyErr_Clear();
3057 return false;
3058 }
3059
3060 if (PyErr_Occurred())
3061 PyErr_Clear();
3062
3063 lldb::ExecutionContextRefSP exe_ctx_ref_sp;
3064 if (exe_ctx)
3065 exe_ctx_ref_sp.reset(new ExecutionContextRef(exe_ctx));
3066 PythonObject ctx_ref_obj = SWIGBridge::ToSWIGWrapper(exe_ctx_ref_sp);
3067
3068 bool py_return = unwrapOrSetPythonException(As<bool>(
3069 implementor.CallMethod(callee_name, ctx_ref_obj,
3070 long_option.str().c_str(), value.str().c_str())));
3071
3072 // if it fails, print the error but otherwise go on
3073 if (PyErr_Occurred()) {
3074 PyErr_Print();
3075 PyErr_Clear();
3076 return false;
3077 }
3078 return py_return;
3079}
3080
3081bool ScriptInterpreterPythonImpl::GetLongHelpForCommandObject(
3082 StructuredData::GenericSP cmd_obj_sp, std::string &dest) {
3083 dest.clear();
3084
3085 Locker py_lock(this, Locker::AcquireLock | Locker::NoSTDIN, Locker::FreeLock);
3086
3087 if (!cmd_obj_sp)
3088 return false;
3089
3090 PythonObject implementor(PyRefType::Borrowed,
3091 (PyObject *)cmd_obj_sp->GetValue());
3092
3093 if (!implementor.IsAllocated())
3094 return false;
3095
3096 llvm::Expected<PythonObject> expected_py_return =
3097 implementor.CallMethod("get_long_help");
3098
3099 if (!expected_py_return) {
3100 llvm::consumeError(expected_py_return.takeError());
3101 return false;
3102 }
3103
3104 PythonObject py_return = std::move(expected_py_return.get());
3105
3106 bool got_string = false;
3107 if (py_return.IsAllocated() && PythonString::Check(py_return.get())) {
3108 PythonString str(PyRefType::Borrowed, py_return.get());
3109 llvm::StringRef str_data(str.GetString());
3110 dest.assign(str_data.data(), str_data.size());
3111 got_string = true;
3112 }
3113
3114 return got_string;
3115}
3116
3117std::unique_ptr<ScriptInterpreterLocker>
3118ScriptInterpreterPythonImpl::AcquireInterpreterLock() {
3119 std::unique_ptr<ScriptInterpreterLocker> py_lock(new Locker(
3120 this, Locker::AcquireLock | Locker::InitSession | Locker::NoSTDIN,
3121 Locker::FreeLock | Locker::TearDownSession));
3122 return py_lock;
3123}
3124
3125void ScriptInterpreterPythonImpl::Initialize() {
3127
3128 // RAII-based initialization which correctly handles multiple-initialization,
3129 // version- specific differences among Python 2 and Python 3, and saving and
3130 // restoring various other pieces of state that can get mucked with during
3131 // initialization.
3132 InitializePythonRAII initialize_guard;
3133
3134 LLDBSwigPyInit();
3135
3136 // Update the path python uses to search for modules to include the current
3137 // directory.
3138
3139 PyRun_SimpleString("import sys");
3140 AddToSysPath(AddLocation::End, ".");
3141
3142 // Don't denormalize paths when calling file_spec.GetPath(). On platforms
3143 // that use a backslash as the path separator, this will result in executing
3144 // python code containing paths with unescaped backslashes. But Python also
3145 // accepts forward slashes, so to make life easier we just use that.
3146 if (FileSpec file_spec = GetPythonDir())
3147 AddToSysPath(AddLocation::Beginning, file_spec.GetPath(false));
3148 if (FileSpec file_spec = HostInfo::GetShlibDir())
3149 AddToSysPath(AddLocation::Beginning, file_spec.GetPath(false));
3150
3151 PyRun_SimpleString("sys.dont_write_bytecode = 1; import "
3152 "lldb.embedded_interpreter; from "
3153 "lldb.embedded_interpreter import run_python_interpreter; "
3154 "from lldb.embedded_interpreter import run_one_line");
3155
3156#if LLDB_USE_PYTHON_SET_INTERRUPT
3157 // Python will not just overwrite its internal SIGINT handler but also the
3158 // one from the process. Backup the current SIGINT handler to prevent that
3159 // Python deletes it.
3160 RestoreSignalHandlerScope save_sigint(SIGINT);
3161
3162 // Setup a default SIGINT signal handler that works the same way as the
3163 // normal Python REPL signal handler which raises a KeyboardInterrupt.
3164 // Also make sure to not pollute the user's REPL with the signal module nor
3165 // our utility function.
3166 PyRun_SimpleString("def lldb_setup_sigint_handler():\n"
3167 " import signal;\n"
3168 " def signal_handler(sig, frame):\n"
3169 " raise KeyboardInterrupt()\n"
3170 " signal.signal(signal.SIGINT, signal_handler);\n"
3171 "lldb_setup_sigint_handler();\n"
3172 "del lldb_setup_sigint_handler\n");
3173#endif
3174}
3175
3176void ScriptInterpreterPythonImpl::AddToSysPath(AddLocation location,
3177 std::string path) {
3178 std::string path_copy;
3179
3180 std::string statement;
3181 if (location == AddLocation::Beginning) {
3182 statement.assign("sys.path.insert(0,\"");
3183 statement.append(path);
3184 statement.append("\")");
3185 } else {
3186 statement.assign("sys.path.append(\"");
3187 statement.append(path);
3188 statement.append("\")");
3189 }
3190 PyRun_SimpleString(statement.c_str());
3191}
3192
3193// We are intentionally NOT calling Py_Finalize here (this would be the logical
3194// place to call it). Calling Py_Finalize here causes test suite runs to seg
3195// fault: The test suite runs in Python. It registers SBDebugger::Terminate to
3196// be called 'at_exit'. When the test suite Python harness finishes up, it
3197// calls Py_Finalize, which calls all the 'at_exit' registered functions.
3198// SBDebugger::Terminate calls Debugger::Terminate, which calls lldb::Terminate,
3199// which calls ScriptInterpreter::Terminate, which calls
3200// ScriptInterpreterPythonImpl::Terminate. So if we call Py_Finalize here, we
3201// end up with Py_Finalize being called from within Py_Finalize, which results
3202// in a seg fault. Since this function only gets called when lldb is shutting
3203// down and going away anyway, the fact that we don't actually call Py_Finalize
3204// should not cause any problems (everything should shut down/go away anyway
3205// when the process exits).
3206//
3207// void ScriptInterpreterPythonImpl::Terminate() { Py_Finalize (); }
3208
3209#endif
static llvm::raw_ostream & error(Stream &strm)
#define lldbassert(x)
Definition: LLDBAssert.h:15
#define LLDB_LOGF(log,...)
Definition: Log.h:376
#define LLDB_LOGV(log,...)
Definition: Log.h:383
#define LLDB_PLUGIN_DEFINE(PluginName)
Definition: PluginManager.h:32
@ eIOHandlerWatchpoint
@ eIOHandlerBreakpoint
@ eIOHandlerNone
#define LLDB_SCOPED_TIMER()
Definition: Timer.h:83
A command line argument class.
Definition: Args.h:33
bool GetQuotedCommandString(std::string &command) const
Definition: Args.cpp:232
"lldb/Breakpoint/BreakpointOptions.h" Class that manages the options on a breakpoint or breakpoint lo...
void SetCallback(BreakpointHitCallback callback, const lldb::BatonSP &baton_sp, bool synchronous=false)
Adds a callback to the breakpoint option set.
void AppendErrorWithFormatv(const char *format, Args &&... args)
void void AppendError(llvm::StringRef in_string)
void AppendErrorWithFormat(const char *format,...) __attribute__((format(printf
lldb::ReturnStatus GetStatus() const
A uniqued constant string class.
Definition: ConstString.h:40
A class to manage flag bits.
Definition: Debugger.h:80
void RunIOHandlerAsync(const lldb::IOHandlerSP &reader_sp, bool cancel_top_handler=true)
Run the given IO handler and return immediately.
Definition: Debugger.cpp:1224
ScriptInterpreter * GetScriptInterpreter(bool can_create=true, std::optional< lldb::ScriptLanguage > language={})
Definition: Debugger.cpp:1719
ExecuteScriptOptions & SetMaskoutErrors(bool maskout)
ExecuteScriptOptions & SetSetLLDBGlobals(bool set)
ExecuteScriptOptions & SetEnableIO(bool enable)
Execution context objects refer to objects in the execution of the program that is being debugged.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
A file utility class.
Definition: FileSpec.h:56
void AppendPathComponent(llvm::StringRef component)
Definition: FileSpec.cpp:447
void SetDirectory(ConstString directory)
Directory string set accessor.
Definition: FileSpec.cpp:335
bool RemoveLastPathComponent()
Removes the last path component by replacing the current path with its parent.
Definition: FileSpec.cpp:458
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
Definition: FileSpec.cpp:367
llvm::StringRef GetFileNameExtension() const
Extract the extension of the file.
Definition: FileSpec.cpp:403
An abstract base class for files.
Definition: File.h:36
bool IsValid() const override
IsValid.
Definition: File.cpp:113
virtual Status Flush()
Flush the current stream.
Definition: File.cpp:156
lldb::StreamFileSP GetErrorStreamFileSP()
Definition: IOHandler.cpp:107
lldb::StreamFileSP GetOutputStreamFileSP()
Definition: IOHandler.cpp:105
void SetIsDone(bool b)
Definition: IOHandler.h:85
LoadScriptOptions & SetInitSession(bool b)
LoadScriptOptions & SetSilent(bool b)
void PutCString(const char *cstr)
Definition: Log.cpp:145
A plug-in interface definition class for debugging a process.
Definition: Process.h:343
void Flush()
Flush our output and error file handles.
const void * GetPointer() const
Definition: ScriptObject.h:22
This base class provides an interface to stack frames.
Definition: StackFrame.h:44
An error handling class.
Definition: Status.h:118
General Outline: When we hit a breakpoint we need to package up whatever information is needed to eva...
const char * GetData() const
Definition: StreamString.h:45
llvm::StringRef GetString() const
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Definition: Stream.cpp:134
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
Definition: Stream.cpp:65
std::string CopyList(const char *item_preamble=nullptr, const char *items_sep="\n") const
Definition: StringList.cpp:198
size_t SplitIntoLines(const std::string &lines)
Definition: StringList.cpp:152
void AppendString(const std::string &s)
Definition: StringList.cpp:43
const char * GetStringAtIndex(size_t idx) const
Definition: StringList.cpp:86
size_t GetSize() const
Definition: StringList.cpp:74
std::shared_ptr< Generic > GenericSP
std::shared_ptr< Dictionary > DictionarySP
std::shared_ptr< Object > ObjectSP
std::shared_ptr< Array > ArraySP
Defines a symbol context baton that can be handed other debug core functions.
Definition: SymbolContext.h:34
lldb::BreakpointSP GetBreakpointByID(lldb::break_id_t break_id)
Definition: Target.cpp:405
Debugger & GetDebugger()
Definition: Target.h:1080
WatchpointList & GetWatchpointList()
Definition: Target.h:790
A timer class that simplifies common timing metrics.
Definition: Timer.h:23
A collection of ValueObject values that.
lldb::ValueObjectSP GetSP()
Definition: ValueObject.h:569
lldb::WatchpointSP FindByID(lldb::watch_id_t watchID) const
Returns a shared pointer to the watchpoint with id watchID, const version.
"lldb/Breakpoint/WatchpointOptions.h" Class that manages the options on a watchpoint.
void SetCallback(WatchpointHitCallback callback, const lldb::BatonSP &baton_sp, bool synchronous=false)
Adds a callback to the watchpoint option set.
#define UINT32_MAX
Definition: lldb-defines.h:19
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
Definition: Log.h:332
Definition: SBAddress.h:15
@ eScriptLanguagePython
std::shared_ptr< lldb_private::ScriptedStopHookInterface > ScriptedStopHookInterfaceSP
Definition: lldb-forward.h:413
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
Definition: lldb-forward.h:424
std::shared_ptr< lldb_private::BreakpointLocation > BreakpointLocationSP
Definition: lldb-forward.h:324
std::shared_ptr< lldb_private::IOHandler > IOHandlerSP
Definition: lldb-forward.h:361
std::shared_ptr< lldb_private::ScriptInterpreter > ScriptInterpreterSP
Definition: lldb-forward.h:406
std::shared_ptr< lldb_private::ScriptedThreadPlanInterface > ScriptedThreadPlanInterfaceSP
Definition: lldb-forward.h:417
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
Definition: lldb-forward.h:484
std::shared_ptr< lldb_private::TypeSummaryOptions > TypeSummaryOptionsSP
Definition: lldb-forward.h:476
std::shared_ptr< lldb_private::OperatingSystemInterface > OperatingSystemInterfaceSP
Definition: lldb-forward.h:383
std::shared_ptr< lldb_private::Breakpoint > BreakpointSP
Definition: lldb-forward.h:321
std::shared_ptr< lldb_private::ScriptedThreadInterface > ScriptedThreadInterfaceSP
Definition: lldb-forward.h:415
std::shared_ptr< lldb_private::ValueObjectList > ValueObjectListSP
Definition: lldb-forward.h:488
std::shared_ptr< lldb_private::Debugger > DebuggerSP
Definition: lldb-forward.h:339
std::shared_ptr< lldb_private::Watchpoint > WatchpointSP
Definition: lldb-forward.h:489
std::shared_ptr< lldb_private::StreamFile > StreamFileSP
Definition: lldb-forward.h:433
@ eSearchDepthInvalid
@ kLastSearchDepthKind
@ eSearchDepthModule
uint64_t user_id_t
Definition: lldb-types.h:82
std::shared_ptr< lldb_private::TypeImpl > TypeImplSP
Definition: lldb-forward.h:464
std::shared_ptr< lldb_private::Target > TargetSP
Definition: lldb-forward.h:448
std::shared_ptr< lldb_private::File > FileSP
Definition: lldb-forward.h:353
std::unique_ptr< lldb_private::ScriptedProcessInterface > ScriptedProcessInterfaceUP
Definition: lldb-forward.h:411
std::shared_ptr< lldb_private::ExecutionContextRef > ExecutionContextRefSP
Definition: lldb-forward.h:350