Skip to content

Commit f30aadb

Browse files
[lldb] enable stdin with stdin command (#52)
using `stdin` with gdb will raise AttributeError
1 parent 21b740c commit f30aadb

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

src/idd/cli.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,12 @@ async def execute_debugger_command(self, event: Input.Changed) -> None:
313313
self.parallel_command_bar.value == "exit":
314314
Debugger.terminate()
315315
exit(0)
316-
if self.parallel_command_bar.value != "":
316+
317+
if self.parallel_command_bar.value.startswith("stdin "):
318+
Debugger.insert_stdin(self.parallel_command_bar.value[6:] + "\n")
319+
result = {}
320+
321+
elif self.parallel_command_bar.value != "":
317322
result = Debugger.run_parallel_command(self.parallel_command_bar.value)
318323

319324
self.diff_area1.append([self.parallel_command_bar.value])
@@ -330,15 +335,20 @@ async def execute_debugger_command(self, event: Input.Changed) -> None:
330335
self.diff_area1.append([self.parallel_command_bar.value])
331336
self.diff_area2.append([self.parallel_command_bar.value])
332337

333-
await self.set_common_command_result(result)
338+
if result:
339+
await self.set_common_command_result(result)
334340

335341
self.parallel_command_bar.value = ""
336342

337343
elif event.control.id == 'base-command-bar':
338344
if self.only_base and (self.base_command_bar.value == "exit" or self.base_command_bar.value == "quit"):
339345
Debugger.terminate()
340346
exit(0)
341-
if self.base_command_bar.value != "":
347+
348+
if self.base_command_bar.value.startswith("stdin "):
349+
Debugger.insert_stdin_single(self.base_command_bar.value[6:] + "\n", "base")
350+
351+
elif self.base_command_bar.value != "":
342352
result = Debugger.run_single_command(self.base_command_bar.value, "base")
343353
self.diff_area1.append([self.base_command_bar.value])
344354
self.diff_area1.append(result)
@@ -359,7 +369,10 @@ async def execute_debugger_command(self, event: Input.Changed) -> None:
359369
self.base_command_bar.value = ""
360370

361371
elif event.control.id == 'regressed-command-bar':
362-
if self.regressed_command_bar.value != "":
372+
if self.regressed_command_bar.value.startswith("stdin "):
373+
Debugger.insert_stdin_single(self.regressed_command_bar.value[6:] + "\n", "regressed")
374+
375+
elif self.regressed_command_bar.value != "":
363376
result = Debugger.run_single_command(self.regressed_command_bar.value, "regressed")
364377
self.diff_area2.append([self.regressed_command_bar.value])
365378
self.diff_area2.append(result)

src/idd/debuggers/lldb/lldb_driver.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@
1212
class LLDBGetState:
1313
pass
1414

15+
16+
class LLDBStdin:
17+
def __init__(self, text: str):
18+
self.text = text
19+
20+
1521
class LLDBDebugger:
1622
is_initted = False
1723

@@ -93,6 +99,9 @@ def get_current_calls(self):
9399
target = self.lldb_instance.GetTargetAtIndex(0)
94100
calls = get_call_instructions(target)
95101
return calls
102+
103+
def insert_stdin(self, text: str):
104+
self.target.GetProcess().PutSTDIN(text)
96105

97106
def terminate(self):
98107
return
@@ -107,6 +116,8 @@ def run(lldb_args, pipe):
107116
if isinstance(args, LLDBGetState) or isinstance(kwargs, LLDBGetState):
108117
res = lldb.get_state()
109118
pipe.send(res)
119+
elif isinstance(args, LLDBStdin):
120+
lldb.insert_stdin(args.text)
110121
else:
111122
res = lldb.run_single_command(*args, **kwargs)
112123
stdout = lldb.target.GetProcess().GetSTDOUT(1024 * 1024 * 10)
@@ -157,6 +168,18 @@ def run_parallel_command(self, command):
157168
"regressed": self.regressed_pipe.recv(),
158169
}
159170

171+
def insert_stdin(self, text: str):
172+
text = LLDBStdin(text)
173+
self.base_pipe.send((text, text))
174+
self.regressed_pipe.send((text, text))
175+
176+
def insert_stdin_single(self, text: str, target: str):
177+
text = LLDBStdin(text)
178+
if target == "base":
179+
self.base_pipe.send((text, text))
180+
if target == "regressed":
181+
self.regressed_pipe.send((text, text))
182+
160183
def terminate(self):
161184
terminate_all_IDDGdbController()
162185

0 commit comments

Comments
 (0)