Возвращение GDB на дочерний процесс - PullRequest
7 голосов
/ 04 марта 2012

У меня есть приложение, которое разветвляет дочерний процесс.

Дочерний процесс выполняет некоторую работу, и где-то посередине он вызывает ошибку сегментации.Я использовал GDB для отладки, я использовал:

set follow-fork-mode child

Я также установил точку останова для функции в дочернем элементе.Но GDB не останавливается на моей точке останова.

Также родительский процесс обрабатывает ошибку сегмента, поэтому мне пришлось нажать ctrl-c для выхода.Затем, когда я использую backtrace для печати стека, все, что я получил, это

Нет стека

Почему не установлена ​​точка останова и почему я не получилстек

1 Ответ

8 голосов
/ 04 марта 2012

Почему точка останова не устанавливается

Точка останова устанавливается , но не срабатывает, потому что ...

а почему я не получил стек?

... вы явно отлаживаете неправильный процесс.

С set follow-fork-mode child GDB будет следовать за первым дочерним элементом, которого вы создадите. Возможно, вы создаете более одного?

Один из способов отладки - установить обработчик SIGSEGV, используя signal или sigaction.

В обработчике сделайте это:

void handler(int signo)
{
  int i = 1;
  fprintf(stderr, "pid=%d, got signal=%d\n", getpid(), signo);
  while (i) { }
}

Как только вы увидите напечатанное сообщение, в другом окне:

 gdb /proc/<pid>/exe <pid>
 (gdb) where
...