环境是:
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的任务树= {
...
有什么想法吗?
答案 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中,不知道为什么他们不认为这是个问题。