Как отлаживать программы по сигналам? - PullRequest
10 голосов
/ 15 мая 2011
#include <stdio.h> 
#include <signal.h>

static volatile sig_atomic_t being_debugged = 1;
static void int3_handler(int signo) { being_debugged = 0; }

int main()
{
        signal(SIGTRAP, int3_handler);
        __asm__ __volatile__("int3");
        if (being_debugged) {
        puts("No, I don't want to serve you.");
                while (1) {
            /* endless loop */ ;
        }
        }
        puts("Yes, real routines go here.");
        return 0;
}

Приведенный выше вывод будет отличаться при запуске внутри / снаружи gdb, поскольку gdb захватывает сигнал sigtrap.

Как заставить мою программу вести себя так же в GDB?

1 Ответ

17 голосов
/ 15 мая 2011

GDB остановит подчиненную (отлаживаемую) программу, когда подчиненный получит какой-либо сигнал.

Если вы просто continue от GDB, сигнал будет «проглочен», что не то, что вам нужно.

Вы можете попросить GDB продолжить программу и отправить ему сигнал с помощью signal SIGTRAP.

Вы также можете попросить GDB передать данный сигнал непосредственно подчиненномуи вообще не останавливаться с помощью команды handle SIGTRAP nostop noprint pass GDB.Вам нужно будет сделать это до того, как вы нажмете первый SIGTRAP.

...