Linux gdbserver可以';“廉洁”;“一些”;进程,由gdbserver调用的kill(pid,2)';t向进程发送SIGINT,什么';发生什么事了?

Linux gdbserver可以';“廉洁”;“一些”;进程,由gdbserver调用的kill(pid,2)';t向进程发送SIGINT,什么';发生什么事了?,linux,debugging,gdb,gdbserver,Linux,Debugging,Gdb,Gdbserver,环境是: 目标:x86_64客户端,运行条带化的程序 主机:x86_64服务器,具有代码、工具链、条带化程序、用于调试的符号文件 在目标上运行gdbserver: %gdbserver--multi:1234/pathtolog/gdb.log 在目标上运行程序: /一些节目& [1] PID 在主机上运行gdb: %gdb (gdb)目标扩展远程目标IP:1234 (gdb)文件程序 (gdb)setrootfs pathtorootfs (gdb)…//设置库路径等 (gdb)附加PID …

环境是:

目标:x86_64客户端,运行条带化的程序

主机:x86_64服务器,具有代码、工具链、条带化程序、用于调试的符号文件

在目标上运行gdbserver:

%gdbserver--multi:1234/pathtolog/gdb.log

在目标上运行程序:

/一些节目&

[1] PID

在主机上运行gdb:

%gdb

(gdb)目标扩展远程目标IP:1234

(gdb)文件程序

(gdb)setrootfs pathtorootfs

(gdb)…//设置库路径等

(gdb)附加PID

…//正常加载所有内容

…//在某处停下来

(gdb)c

^C^C目标没有响应中断请求

停止调试它?(是或否)

试图找到根本原因:

关于目标:

gdb连接到gdbserver(是的,我现在可以在目标机上使用gdb,但是目标机应该在没有gdb、符号等大小的情况下发布)

(gdb)b杀死

0xf760afb0处的断点1

(gdb)c

继续

当从主机gdb按ctrl+c时,gdbserver将进入断点

/lib/libc.so.6中kill()中的断点1 0xf760afb0

(gdb)

我检查了寄存器,%esp寄存器显示如下:

(gdb)x/32wx 0xffee8070

0xffee8070:0xfffffe0c 0x00000002 0x00000001 0x00000000

0xfffffe0c=-PID 0x00000002=SIGINT

当gdbserver继续运行时,某些程序将收到信号。 因此,kill()对“某些程序”有利,而不是对所有程序有利

并且我将在gdb/gdbserver之间使用tcpdump监视的数据。 若kill()有效(对于“良好”程序),gdbserver将向gdb发送一个数据包

我试过了,发现在这种情况下gdbserver没有向“坏程序”发送任何信号。但我可以调用kill(pid,2)int-gdbserver调试gdb进程

(gdb)呼叫终止(PID,2)

然后dmesg显示如下

[11902.060722]=============发送信号===========

          SIG 2 to 6141[a.out], tgid=6141

          SIG 19 to 6142[a.out], tgid=6141
[11902.111135]6142的任务树={

          SIG 19 to 6142[a.out], tgid=6141

有什么想法吗?

找到了一个可能的匹配项。 gdbserver调用的kill()的参数是-PID,而不是PID

gdbserver不向进程发送SIGINT,而是向进程组发送(-signal_pid)。 但附带的流程并不总是流程组长。 如果不是,“kill(-signal_pid,SIGINT)”返回错误并无法中断连接的进程

这个问题仍然存在于gdb-8.1中,不知道为什么他们不认为这是个问题