为了了解更多信息,并更好地使用C语言进行跨平台构建,我正在开发一个与makefile等效的编译器和调试器。有点像IDE,但不太像。我不想在这一部分中陷入太多的泥潭,但足以说明我想利用开源项目gdbgui的一部分作为调试器
在我的理想使用中,我将在它自己的gdbgui
中启动Process
,这样我就可以从主进程中终止它。幸运的是,gdbgui
是用python编写的,因此用我自己的自定义实现简单地替换main()
应该相对简单
我查看了gdbgui
源代码,找到了main()
的相关位,这些位允许我访问^{
app
是Flask()
的一个实例setup_backend
显然是用一些配置启动flask服务器的函数李>我的意图是做main()
正在做的事情,而不需要所有的命令行解析。更具体地说,定制app
并运行setup_backend()
。为了简洁起见,我删除了一些代码(例如停止进程),但这是功能位:
from multiprocessing import Process
from gdbgui.backend import app as _app
from gdbgui.backend import setup_backend as _setup_backend
def start_stop_gdb():
_app.config['rr'] = False
_app.config['gdb_path'] = 'gdb'
_app.config['show_gdbgui_upgrades'] = False
_app.config['initial_binary_and_args'] = ['./debug.elf']
self.process = Process(
target=_setup_backend,
kwargs={
'serve': True,
'port': 5000,
'open_browser': True
}
)
self.process.start()
这实际上在linux中非常有效,这是我第一次尝试它的地方。我的目标是拥有一个非常可移植的实现,所以我希望它在windows中也能以同样的方式工作
当我在Windows中运行时,我得到一个KeyError
,它表示app
没有rr
键,这是在上面的代码段中特别指定的
如果我直接运行_setup_backend()
而不运行multiprocessing.Process
,那么它在Windows和Linux中工作正常,但是我的主线程会冻结,直到程序退出并且主程序无法停止调试过程
需要说明的是,以下代码段在Windows中工作,但会阻止主线程:
def start_stop_gdb():
_app.config['rr'] = False
_app.config['gdb_path'] = 'gdb'
_app.config['show_gdbgui_upgrades'] = False
_app.config['initial_binary_and_args'] = ['./debug.elf']
_setup_backend(
serve=True, port=5000, 'open_browser'=True
)
简言之,在linux中,app
的实例似乎正在根据需要进行更新,但在windows中,正在使用一个单独的app
实例
想法
目前没有回答
相关问题 更多 >
编程相关推荐