在 MAC 上调试代码,用的调试器一般是 LLDB,默认情况下信号不会传递给被调试程序。
(lldb) process handle SIGINT
NAME PASS STOP NOTIFY
=========== ===== ===== ======
SIGINT false true true 以SIGINT为例,如果想调试它的信号处理器,暂停程序执行后执行下面的代码,让调试器把信号传递给程序。也可以把这行命令加入~/.lldbinit,每次调试器都会自动执行。
(lldb) process handle SIGINT -p true -s false先查看进程id,然后对它发送SIGINT信号,恢复执行后程序会跳转到信号处理器。
(lldb) process status # 查看进程id、
Process 8016 stopped
* thread #1, name = 'main', queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
frame #0: 0x000000019fdaa46c libsystem_kernel.dylib`__accept + 8
libsystem_kernel.dylib`__accept:
-> 0x19fdaa46c <+8>: b.lo 0x19fdaa48c ; <+40>
0x19fdaa470 <+12>: pacibsp
0x19fdaa474 <+16>: stp x29, x30, [sp, #-0x10]!
0x19fdaa478 <+20>: mov x29, sp
(lldb) platform shell kill -INT 8016 # 对刚刚的id发送信号