如何自定义调试器的停止/重新启动按钮行为?



我正在使用VS Code编写和调试绑定到libfuse的C++程序。

不幸的是,如果你用SIGKILL杀死了一个libfuse进程,那么你必须在再次启动程序之前使用sudo umount -f <mountpoint>。如果我每次想要停止或重新启动调试时都必须这样做,这是一个小麻烦,特别是因为我不应该进行身份验证来执行这样的常规任务(尽管挂载是作为我的用户发生的,但sudo在某种程度上是必要的)。

虽然我认为这主要是 FUSE 的错(它应该优雅地从进程被不优雅地杀死并自动卸载而不是离开目录说Transport endpoint is not connected),但我也认为应该有一种方法可以自定义 VS Code(或任何 IDE)在您想要停止调试时运行一些清理。

我发现在调试控制台中输入-exec signal SIGTERM将优雅地正确卸载目录,停止进程并告诉 VS Code 它不再调试(状态栏从橙色变回蓝色)。但我似乎找不到自动化的方法。我尝试使用.gdbinit文件,从这个问题中获得了一些灵感:

handle SIGTERM nostop
# This doesn't work as hook-quit isn't run when quitting via MI mode, which VS Code uses...
define hook-quit
signal SIGTERM
end

但如链接问题中所述,GDB 在 MI 模式下忽略退出钩子,而 VS Code 使用 MI 模式。

对我来说,理想的解决方案是,如果我可以在 .vscode 配置文件中放入一些东西,告诉它在我单击停止或重新启动按钮时发送-exec signal SIGTERM(然后等待它收到调试已停止的任何通知,然后重新启动如果适用),但我想可能没有选择。

即使按钮无法自定义,我也很高兴能够拥有一个键绑定,该键绑定只会将-exec signal SIGTERM发送到调试控制台,而无需我打开所述控制台并输入命令,尽管命令面板在这里没有显示任何有用的内容(看起来不会发送指定的调试控制台命令), 所以我也不指望有一个可绑定的命令。

有人有什么建议吗?或者这些是否属于VS Code github上的功能请求?任何让 GDB 在 MI 模式下尊重其退出钩子的方法,或者让 FUSE 优雅地处理其被杀死的进程的方法也将不胜感激。

我相信您可以通过启动配置的preLaunchTaskpostDebugTask属性来实现所需的目标。

请参阅文档:

  • preLaunchTask- 要在调试会话开始之前启动任务,请将此属性设置为在 tasks.json(在工作区的.vscode文件夹中)中指定的任务的标签。或者,可以将其设置为${defaultBuildTask}以使用默认生成任务。

  • postDebugTask- 要在调试会话结束时启动任务,请将此属性设置为 tasks.json(在工作区的.vscode folder中)中指定的任务的名称。

因此,对于您的特定方案,我很确定您可以创建一个运行命令的任务 - 类似于以下内容:

{
"label": "unmount FUSE",
"type": "shell",
"command": "sudo umount -f ...",
}

然后在postDebugTask任务中使用它。如果你需要做多件事,你可以把它们包装在一个shell脚本或其他东西中,或者使用复合任务。

最新更新