【发布时间】:2019-09-01 16:04:13
【问题描述】:
我正在尝试使用 LLDB 在 OSX 上调试程序,而 control-C 无法停止该程序。它似乎处于无限循环中,我想看看它在哪里;因此我不能只使用断点。这曾经对我有用——我曾经能够控制-C 发送 SIGINT,LLDB 尊重它,并使用相同的工具链停止了这台计算机上的程序。我在终端中看到了^C,但它被忽略了。我还尝试通过其他两种方式将信号发送到 lldb 进程:
- 通过活动监视器的发送信号到进程功能
- 通过 pkill -SIGINT lldb
但是,这也不起作用。另一方面,control-z 确实可以停止 lldb,但这不是我需要的(即能够检查程序状态)。
我在内置终端应用程序和 iTerm2 上都试过了,但我发现两者的行为相同。
版本信息
lldb --version
lldb-1000.11.38.2
Swift-4.2
我认为这是与 XCode 一起安装的 lldb 版本。升级后的 XCode(我不直接使用)可能会破坏这一点。
更新:我将补充一点,在 lldb 中变量名也不会自动完成——我很确定这也可以正常工作。例如,如果我输入 p 然后开始输入变量名,它不会制表符完成。我正在添加此更新以防万一。
【问题讨论】:
-
您是从 lldb 中运行您的进程,还是附加到它。我认为“p”选项卡完成可能吗?在 Xcode 的调试器控制台窗口中工作,但在命令行 lldb 中不起作用 - 它是一个任意 C++/etc 表达式,并且 lldb 不解析它的内容。其他可变打印机制(如“v”)将完成制表符。 Fwiw lldb 版本有点旧,可能是 2018 年 9 月至 11 月。当前发布的 Xcode 将为您提供 lldb-1001.something;今年秋季发布的 Xcode 将为您提供 lldb-1100.something。
-
您是否尝试使用上述方法 1 和 2 向您正在调试的进程发送 SIGINT?如果这些不起作用,那么可能是您正在调试的进程正在阻止 SIGINT。也许尝试发送一些其他信号(如 SIGUSR1)?那可能不会被阻塞,然后只要你使用
process handle SIGUSR1 -p 0使信号不被转发,你就不会改变程序执行。 -
谢谢。我能够解决这个问题。一些有趣的学习: 1)在旧版本(1000.11.38.2)中,当我没有使用命令脚本(仅包含
run)运行但手动运行时,它尊重SIGINT; 2)当我升级到 1001.0.13.3 时,它就可以工作了。现在升级没有实际意义,但似乎带有命令脚本的旧版本以某种方式阻止了 SIGINT。