Is this possible? I want to run my executable whilst having a REPL opened, ideally being able to patch methods or simply just access variables.
If not, are there creative solutions around this? Such as RPC.
Here's my attempt. Effectively I have two threads a main thread (receives input from the user) and a repl thread (to set a breakpoint with LLDB):
Compile & run the swift program (defined below)
swiftc multi_thread.swift
./multi_thread
Debug with LLDB
$ lldb -p 32661
> break multi_thread.swift:8
> c
in the program - start the "repl thread" by entering input and then in LLDB's prompt:
continue the main thread:
<breakpoint will be hit - pausing the program>
> thread continue 1
Finally, try to open a REPL in LLDB:
> repl
With this I receive: error: Process is running. Use 'process interrupt' to pause execution.
Is this due to the implementation of the REPL?
The swift program
# multi_thread.swift
import Foundation
func foobar() {
print("foobar - to patch")
}
func repl_thread() {
while true {
}
}
func main_thread() {
let pid = getpid()
print("Running process with pid:", pid)
// start repl_thread in another thread
let repl = Thread {
repl_thread()
}
print("Waiting for input to start repl thread")
let input = readLine()
if input == nil {
return;
}
repl.start()
while true {
let line = readLine()
if line == nil {
break
}
else if line == "c" {
foobar()
} else {
print(line!)
}
}
}
main_thread()