Piping the debug output to sublime console

This commit is contained in:
Krzosa Karol
2023-01-23 22:54:54 +01:00
parent cebdee1c14
commit a0e25a9b2b
3 changed files with 61 additions and 60 deletions

View File

@@ -39,25 +39,4 @@
"caption": "RemedyBG: All in one, this is for the convienient mouse + keyboard usage", "caption": "RemedyBG: All in one, this is for the convienient mouse + keyboard usage",
"command": "remedy_all_in_one", "command": "remedy_all_in_one",
}, },
{
"caption": "RemedyBG: Build and run to cursor, requires a project",
"command": "remedy_build",
"args": {
"command": "run_to_cursor"
}
},
{
"caption": "RemedyBG: Build and start debugging, requires a project",
"command": "remedy_build",
"args": {
"command": "start_debugging"
}
},
{
"caption": "RemedyBG: Build and goto cursor, requires a project",
"command": "remedy_build",
"args": {
"command": "goto_cursor"
}
},
] ]

View File

@@ -10,4 +10,5 @@
"executable": "remedybg.exe", "executable": "remedybg.exe",
"vc_vars_cmd": "C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Auxiliary/Build/vcvarsall.bat", "vc_vars_cmd": "C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Auxiliary/Build/vcvarsall.bat",
"vc_vars_arch": "amd64", "vc_vars_arch": "amd64",
"output_debug_strings_to_console": true,
} }

View File

@@ -21,6 +21,7 @@ class RemedyInstance:
self.process = None self.process = None
self.servername = "" self.servername = ""
self.breakpoints = {} self.breakpoints = {}
self.settings = sublime.load_settings("Remedy.sublime-settings")
def begin_command(self, cmd): def begin_command(self, cmd):
cmd_buffer = io.BytesIO() cmd_buffer = io.BytesIO()
@@ -281,15 +282,37 @@ class RemedyInstance:
self.close() self.close()
return return
if self.process and self.event_pipe: if self.process and self.event_pipe:
try: event_buffer, event_type = self.get_event()
buffer, nbytes, result = win32pipe.PeekNamedPipe(self.event_pipe, 0) self.process_event(event_buffer, event_type)
if nbytes:
hr, data = win32file.ReadFile(self.event_pipe, nbytes, None) sublime.set_timeout(update, 100)
event_buffer = io.BytesIO(data) #update() end
event_type = int.from_bytes(event_buffer.read(2), 'little')
sublime.set_timeout(update, 100)
except FileNotFoundError as not_found:
sublime.error_message("RemedyBG: " + str(not_found) + ': ' + target)
except pywintypes.error as connection_error:
sublime.error_message("RemedyBG: " + str(connection_error))
except OSError as os_error:
sublime.error_message("RemedyBG: " + str(os_error))
def process_event(self, event_buffer, event_type):
if event_type == EVENTTYPE_EXIT_PROCESS: if event_type == EVENTTYPE_EXIT_PROCESS:
exit_code = int.from_bytes(event_buffer.read(4), 'little') exit_code = int.from_bytes(event_buffer.read(4), 'little')
print('RemedyBG: Debugging terminated with exit code:', exit_code) print('RemedyBG: Debugging terminated with exit code:', exit_code)
elif event_type == EVENTTYPE_OUTPUT_DEBUG_STRING and self.settings.get("output_debug_strings_to_console", False):
text = event_buffer.read(int.from_bytes(event_buffer.read(2), 'little')).decode('utf-8')
print(text.strip())
i = 0
while i < 3000:
i += 1
event_buffer, event_type = self.get_event()
if event_type == EVENTTYPE_OUTPUT_DEBUG_STRING:
text = event_buffer.read(int.from_bytes(event_buffer.read(2), 'little')).decode('utf-8')
print(text.strip())
else:
self.process_event(event_buffer, event_type)
break
elif event_type == EVENTTYPE_BREAKPOINT_ADDED: # @todo: The problem here is that we need to figure out a view to which the marker is going to be bound elif event_type == EVENTTYPE_BREAKPOINT_ADDED: # @todo: The problem here is that we need to figure out a view to which the marker is going to be bound
pass pass
# bp_id = int.from_bytes(event_buffer.read(4), 'little') # bp_id = int.from_bytes(event_buffer.read(4), 'little')
@@ -308,19 +331,20 @@ class RemedyInstance:
v = self.breakpoints[key] v = self.breakpoints[key]
v["view"].erase_regions(key) v["view"].erase_regions(key)
self.breakpoints.pop(key) self.breakpoints.pop(key)
def get_event(self):
try:
buffer, nbytes, result = win32pipe.PeekNamedPipe(self.event_pipe, 0)
if nbytes:
hr, data = win32file.ReadFile(self.event_pipe, nbytes, None)
event_buffer = io.BytesIO(data)
event_type = int.from_bytes(event_buffer.read(2), 'little')
return event_buffer, event_type
return None, None
except win32api.error as pipe_error: except win32api.error as pipe_error:
print('RemedyBG: Error occured while trying to update, we got disconnected:', pipe_error) print('RemedyBG: Error occured while trying to update, we got disconnected:', pipe_error)
self.close() self.close()
return return None, None
sublime.set_timeout(update, 1000)
sublime.set_timeout(update, 1000)
except FileNotFoundError as not_found:
sublime.error_message("RemedyBG: " + str(not_found) + ': ' + target)
except pywintypes.error as connection_error:
sublime.error_message("RemedyBG: " + str(connection_error))
except OSError as os_error:
sublime.error_message("RemedyBG: " + str(os_error))
def filename_and_line(): def filename_and_line():
window = sublime.active_window() window = sublime.active_window()
@@ -347,8 +371,7 @@ remedy_instance = RemedyInstance()
def get_remedy_executable(): def get_remedy_executable():
window = sublime.active_window() window = sublime.active_window()
settings = sublime.load_settings("Remedy.sublime-settings") result = remedy_instance.settings.get("executable", "remedybg")
result = settings.get("executable", "remedybg")
return result return result
def get_build_system(window): def get_build_system(window):
@@ -376,8 +399,7 @@ def get_build_system(window):
return project, build return project, build
def should_build_before_debugging(window): def should_build_before_debugging(window):
settings = sublime.load_settings("Remedy.sublime-settings") build_before = remedy_instance.settings.get("build_before_debugging", False)
build_before = settings.get("build_before_debugging", False)
if build_before: if build_before:
project, build = get_build_system(window) project, build = get_build_system(window)
if project == None or build == None: if project == None or build == None:
@@ -555,8 +577,7 @@ class RemedyAllInOneCommand(sublime_plugin.TextCommand):
class RemedyOnBuildCommand(sublime_plugin.EventListener): class RemedyOnBuildCommand(sublime_plugin.EventListener):
def on_window_command(self, window, command_name, args): def on_window_command(self, window, command_name, args):
if command_name in ["build", "remedy_build"]: if command_name in ["build", "remedy_build"]:
settings = sublime.load_settings("Remedy.sublime-settings") if remedy_instance.settings.get("stop_debugging_on_build_command", False):
if settings.get("stop_debugging_on_build_command", False):
remedy_instance.stop_debugging() remedy_instance.stop_debugging()
def plugin_unloaded(): def plugin_unloaded():