gdbserver无法中断“某些”进程,gdbserver调用的kill(pid,2)没有将SIGINT发送到进程,这是怎么回事?

时间:2018-08-22 06:28:01

标签: linux debugging gdb gdbserver

环境是:

target:x86_64客户端,运行条带化程序

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

在目标上运行gdbserver:

  

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

在目标上运行程序:

  

./ someprogram&

     

[1] PID

在主机上运行gdb:

  

%gdb

     

(gdb)target扩展远程TARGETIP:1234

     

(gdb)文件某些程序

     

(gdb)setrootfs pathtorootfs

     

(gdb)... //设置lib路径等

     

(gdb)附加PID

     

... //正常加载所有内容

     

... //停在某处

     

(gdb)c

     

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

     

停止调试吗? (是或否)

试图找到根本原因:

在目标上

将gdb附加到gdbserver(是的,我现在可以在目标计算机上使用gdb,但是要释放目标计算机而没有gdb,符号等)。

  

(gdb)b kill

     

在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()工作正常(适用于“ GOOD”程序),则gdbserver会将数据包发送到gdb。

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

  

(gdb)调用kill(PID,2)

然后dmesg显示如下

  

[11902.060722] ========== send_signal ===========

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

...

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

[11902.111135] 6142的任务树= {

     

...

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

找出了可能的匹配bug of gdbserver。 gdbserver调用的kill()参数是-PID,而不是PID。

  

gdbserver不是将SIGINT发送给进程,而是发送给进程组(-signal_pid)。   但是附属的流程并不总是流程组组长。   如果没有,“ kill(-signal_pid,SIGINT)”将返回错误,并且无法中断附加的进程。

static void linux_request_interrupt (void)
{
  /* Send a SIGINT to the process group.  This acts just like the user
     typed a ^C on the controlling terminal.  */
-  kill (-signal_pid, SIGINT);
+  kill (signal_pid, SIGINT);
}

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