为了了解更多 - 并在C中实现更好的跨平台构建 - 我正在研究makefile等效编译器和调试器。像IDE这样的东西,但不是那么多。我不想在这部分中陷入困境,但足以解释我想利用名为gdbgui的开源项目的一部分作为调试器。
在我理想的使用中,我会在自己的gdbgui
中启动Process
,以便我可以从主进程中删除它。幸运的是,gdbgui
是用python编写的,所以用我自己的自定义实现简单地替换main()
应该相对简单。
我查看了gdbgui
来源,找到main()
的相关位,以便我访问backend.py
中的功能部分:
app
是Flask()
setup_backend
显然是用一些配置启动烧瓶服务器的功能。我的目的是做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
实例。
思想?