Piping the debug output to sublime console
This commit is contained in:
@@ -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"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
]
|
]
|
||||||
@@ -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,
|
||||||
}
|
}
|
||||||
65
remedy.py
65
remedy.py
@@ -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():
|
||||||
|
|||||||
Reference in New Issue
Block a user