在LLDB中向应用程序发送Ctrl-C

7

我有一个CLI应用程序,当结束时(发送Ctrl-C后)发生段错误。

在lldb中按下Ctrl-C自然会暂停执行。

然后我尝试:

(lldb)process signal SIGINT

(lldb)process continue

但这似乎并没有做任何事情来终止该应用程序。

还尝试过:

(lldb)process signal 2

2个回答

9

调试器使用^C来中断目标进程,因此它默认不会将^C传递到目标进程。您可以使用"process handle"命令来更改此行为:

(lldb) process handle SIGINT -p true

告诉lldb将SIGINT“传递”给进程。
如果您在lldb中通过发出^C停止了进程,那么当您像这里显示的更改process handle并继续时,该SIGINT将被转发到进程。
如果您因其他原因停止了进程,在指定将SIGINT传递给进程之后,可以通过使用process status获取调试程序的PID并使用平台shell直接向该进程发送SIGINT来生成SIGINT。
(lldb) process status 
(lldb) platform shell kill -INT {{PID from previous step}}
(lldb) continue

在我的情况下,我还必须通过发出命令 process handle SIGINT -s false 来禁用调试器停止。 - Siyuan Ren
对我来说,这会出现“错误:没有当前进程;在您拥有有效进程之前无法处理信号。” - oarfish
即使您在启动进程之后运行该命令,它仍不会将^C作为SIGINT发送到应用程序。 - celticminstrel

3
我发现最简单的方法就是直接向进程发送 SIGINT 信号。获取被调试进程的进程 ID(使用 process status 命令可以查看),然后运行以下命令:
kill -INT <pid>

从另一个终端执行。


请注意,您也可以在lldb中执行platform shell kill -INT <pid>。请注意,这与在lldb中运行^C或“process interrupt”不同,后者知道中断信号是为了实现中断,因此将被抑制。 - Jim Ingham
这似乎不起作用,只会导致调试器暂停。如果使用 platform shell 命令执行,看起来好像什么都没有发生,但是一旦你继续执行,它就会立即再次停止以处理中断信号。 - Dyllon Gagnier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接