GDB 7.0, сигнал SIGCONT не прерывается от вызова pause () - PullRequest
2 голосов
/ 30 ноября 2009

Я собрал версию gdb 7.0 для себя после того, как мне указали на новую функцию, и оказалось, что она все еще на моем пути.

Пытаясь пройтись по новому коду, я добавил вызов pause (), ожидая, что смогу выйти так:

(gdb) b 5048
Breakpoint 1 at 0x2b1811b25052: file testca.C, line 5048.
(gdb) signal SIGCONT
Continuing with signal SIGCONT.

Breakpoint 1, FLUSH_SUDF_TEST (h=@0x2b1811b061c0) at testca.C:5048
5048       rc = h.SAL_testcaFlushPagesByUDF( uPrimary - 1, uPrimary ) ;

(это было с системой GDB, версия 6.6).

С gdb 7.0 я никогда не достигаю точки останова post-pause (), когда пытаюсь это сделать. С различными изменениями отладки мультипроцессора в gdb 7 кто-нибудь знает, нужно ли обрабатывать сигналы по-другому и как?

1 Ответ

2 голосов
/ 13 февраля 2010

Функция pause() не возвращается, если не вызывается обработчик сигнала (см. Спецификацию и справочную страницу ).

Чтобы вернуть его после того, как ваша программа получит SIGCONT, вы должны установить обработчик для SIGCONT. Попробуйте и посмотрите, используя следующий пример:

#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

volatile int caught_signal = 0;

void handler(int sig)
{
    caught_signal = sig; 
}

int main()
{
    signal(SIGCONT, handler);
    pause();
    printf("Caught signal: %d, %s\n",
            caught_signal, strsignal(caught_signal));
    return 0;
}

Поведение корректно с GDB 7.0: pause() полностью игнорирует игнорируемые сигналы (например, SIGCHLD, возвращает обнаруженные сигналы (SIGCONT), и при подаче команды continue сигнал не доставляется.

(gdb) break 17
Breakpoint 1 at 0x80484b3: file pause.c, line 17.
(gdb) continue
Continuing.
^C
Program received signal SIGINT, Interrupt.
0x0012d422 in __kernel_vsyscall ()
(gdb) signal SIGCHLD
Continuing with signal SIGCHLD.
^C
Program received signal SIGINT, Interrupt.
0x0012d422 in __kernel_vsyscall ()
(gdb) signal SIGCONT
Continuing with signal SIGCONT.

Breakpoint 1, main () at pause.c:17
17      printf("Caught signal: %d, %s\n",
(gdb) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...