Hi, Maxim!
Thanks for the patch!
Please consider my comments below.

On 04.04.2024 01:21, Maxim Kokryashkin via Tarantool-patches wrote:
<snipped>
+class Debugger(object):
+    def __init__(self):
+        self.GDB = False
+        self.LLDB = False
+
+        debuggers = {
+            'gdb': lambda lib: True,
+            'lldb': lambda lib: lib.debugger is not None,
+        }
+        for name, healthcheck in debuggers.items():
+            lib = None
+            try:
+                lib = import_module(name)
+                if healthcheck(lib):
+                    setattr(self, name.upper(), True)
+                    globals()[name] = lib
+                    self.name = name
+            except Exception:
+                continue
+
+        assert self.LLDB != self.GDB

I'd suggest to use two separate implementations of Debugger interface for GDB and LLDB, so you would not need all these checking (like `if self.LLDB`) in every single method of all-in-one implementation.

With this approach it seems any initial setup that is specific to certain debugger (like setup of event_connect/event_disconnect handlers for GDB) could be done as a part of corresponding __init__ method.

<snipped>
-- 
Best regards,
Mikhail Elhimov