Здравсте!
Не проходят сигналы приложению при трассировке. Те не вызывается обработчик в трассируемом приложении:
sigtest.c:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <syscall.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
void sig_handler(int signum) {
write(1,"SIG\n",4);
sleep(1);
}
void main() {
signal(15, sig_handler);
sleep(20);
return;
}
dbgr.c:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <syscall.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
#include <sys/user.h>
#include <inttypes.h>
int main(int argnum,char ** args) {
int pid=atoi(args[1]);
ptrace(PTRACE_ATTACH,pid, 0, 0);
struct user_regs_struct regs;
int wait_stat;
int rsig;
waitpid(pid,&wait_stat,0);
while (WIFSTOPPED(wait_stat)) {
ptrace(PTRACE_GETREGS,pid, 0,®s);
rsig=WSTOPSIG(wait_stat);
dprintf(2," \n %d %"PRIx64"\n",rsig,regs.rip);
if (ptrace(PTRACE_SINGLESTEP, pid, 0, 0) != 0) {perror("ptrace_singlestep"); return -1;};
waitpid(pid,&wait_stat,0);
}
}
Если запустить sigtest и в течении 20 секунд подключится к нему через dbgr, а затем отправить сигнал 15 процессу sigtest, то он его проигнорирует, хотя dbgr выведет сообщение
5 7fc478feb2f0
15 7fc478feb2f0
Собственно вопрос: как можно пропустить сигнал в приложение, не останавливая трассировку?