gdbserver无法中断“SOME”进程,gdbserver调用kill(pid,2)没有发送SIGINT进程,发生了什么事?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gdbserver无法中断“SOME”进程,gdbserver调用kill(pid,2)没有发送SIGINT进程,发生了什么事?相关的知识,希望对你有一定的参考价值。

环境是:

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

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

在目标上运行gdbserver:

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

在目标上运行程序:

./someprogram&

[1] PID

在主机上运行gdb:

GDB%

(gdb)target extended-remote TARGETIP:1234

(gdb)文件someprogram

(gdb)setrootfs pathtorootfs

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

(gdb)附加PID

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

... //停在某个地方

(GDB)C

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

停止调试吗? (是或否)

试图找到根本原因:

在目标上:

gdb附加到gdbserver(是的,我现在可以在目标上使用gdb,但是目标机器应该在没有gdb,symbles等的情况下发布)。

(gdb)b杀死

断点1在0xf760afb0

(gdb)c

继续。

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

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

(GDB)

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

(gdb)x / 32wx 0xffee8070

0xffee8070:0xfffffe0c 0x00000002 0x00000001 0x00000000

0xfffffe0c = -PID 0x00000002 = SIGINT

一些程序将在gdbserver继续时获取信号。所以,kill()对“SOME PROGRAM”有好处,而不是全部。

我在gdb / gdbserver之间使用tcpdump监控数据。如果kill()工作(对于“GOOD”程序),gdbserver将向gdb发送一个数据包。

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

(gdb)call 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 = {

...

有任何想法吗?

答案

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

gdbserver不向进程发送SIGINT,而是向进程组发送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中,不知道为什么他们不认为这是一个问题。

以上是关于gdbserver无法中断“SOME”进程,gdbserver调用kill(pid,2)没有发送SIGINT进程,发生了什么事?的主要内容,如果未能解决你的问题,请参考以下文章

linux内核调试技术之GDB和GDBServer

安装GDB和GDBSERVER

gdb+gdbserver交叉编译

使用gdb+gdbserver调试应用程序

嵌入式arm linux环境中gdb+gdbserver调试

Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件