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进程,发生了什么事?的主要内容,如果未能解决你的问题,请参考以下文章