gdb и fork
От: Taurus Россия  
Дата: 02.11.08 15:43
Оценка:
Есть некая программа которая при работе вызывает кучу модулей. Вызваются они комбинацией vfork/exec. Далее через шеловский скрипт открывается сам модуль, и если нужно то с отладчиком. Как привязать отладчик к самой программе так чтобы он отслеживал запуски этих модулей и сам к ним привязывался? gdb вроде как сказано в документации поддерживает работу с форками и должен сам их перехватывать, но:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
  printf("Hello world!\n");
  pid_t id;
  id = fork();
  if(!id)
  {
    sleep(30);
    printf("Fork\n");
  }
  else
    printf("No Fork\n");
  return 0;
}


(gdb) b 16
Breakpoint 1 at 0x80483f9: file main.c, line 16.
(gdb) run 
Starting program: /root/dev/forks/main 
Hello world!

Breakpoint 1, main () at main.c:16
16          printf("No Fork\n");
(gdb) info forks
No forks.
(gdb) c
Continuing.
No Fork

Program exited normally.
(gdb) Fork


Версия gdb 6.5 другой пока нету.
Re: gdb и fork
От: alexsy Россия  
Дата: 03.11.08 06:35
Оценка:
Здравствуйте, Taurus, Вы писали:

T>Есть некая программа которая при работе вызывает кучу модулей. Вызваются они комбинацией vfork/exec. Далее через шеловский скрипт открывается сам модуль, и если нужно то с отладчиком. Как привязать отладчик к самой программе так чтобы он отслеживал запуски этих модулей и сам к ним привязывался? gdb вроде как сказано в документации поддерживает работу с форками и должен сам их перехватывать, но:


T>
T>#include <stdio.h>
T>#include <unistd.h>
T>#include <sys/types.h>

T>int main()
T>{
T>  printf("Hello world!\n");
T>  pid_t id;
T>  id = fork();
T>  if(!id)
T>  {
T>    sleep(30);
T>    printf("Fork\n");
T>  }
T>  else
T>    printf("No Fork\n");
T>  return 0;
T>}

T>


T>
T>(gdb) b 16
T>Breakpoint 1 at 0x80483f9: file main.c, line 16.
T>(gdb) run 
T>Starting program: /root/dev/forks/main 
T>Hello world!

T>Breakpoint 1, main () at main.c:16
T>16          printf("No Fork\n");
T>(gdb) info forks
T>No forks.
T>(gdb) c
T>Continuing.
T>No Fork

T>Program exited normally.
T>(gdb) Fork
T>


T>Версия gdb 6.5 другой пока нету.




Ну не знай у меня версия по моложе работает так:
[alexsy@localhost64 fork]$ export CFLAGS="-g3 -O0"; make fork
cc -g3 -O0 fork.c -o fork
[alexsy@localhost64 fork]$ gdb ./fork --silent
Using host libthread_db library "/lib64/libthread_db.so.1".
(gdb) list
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <sys/types.h>
4
5 int main()
6 {
7 printf("Hello world!\n");
8 pid_t id;
9 id = fork();
10 if(!id)
(gdb)
11 {
12 sleep(30);
13 printf("Fork\n");
14 }
15 else
16 printf("No Fork\n");
17 return 0;
18 }
(gdb) breac 12
Undefined command: "breac". Try "help".
(gdb) break 12
Breakpoint 1 at 0x400548: file fork.c, line 12.
(gdb) run
Starting program: /home/alexsy/temp/fork/fork
Hello world!
[Detaching after fork from child process 3815. (Try `set detach-on-fork off'.)]
No Fork

Program exited normally.
(gdb) set detach-on-fork off
(gdb) run
Starting program: /home/alexsy/temp/fork/fork
Hello world!
No Fork

Program exited normally.
[Switching to process 3817]
(gdb) Fork

(gdb) step
Single stepping until exit from function fork,
which has no line number information.
main () at fork.c:10
10 if(!id)
(gdb)

Breakpoint 1, main () at fork.c:12
12 sleep(30);
(gdb)
13 printf("Fork\n");
(gdb)
Fork
17 return 0;
(gdb)
18 }
(gdb)
0x00007f41ba5baab4 in __libc_start_main () from /lib64/libc.so.6
(gdb)
Single stepping until exit from function __libc_start_main,
which has no line number information.

Program exited normally.
(gdb) quit
[alexsy@localhost64 fork]$ gdb --version
GNU gdb Red Hat Linux (6.6-16rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
[alexsy@localhost64 fork]$
Re[2]: gdb и fork
От: Taurus Россия  
Дата: 03.11.08 09:17
Оценка:
Здравствуйте, alexsy, Вы писали:

A>Ну не знай у меня версия по моложе работает так:

A>[alexsy@localhost64 fork]$ export CFLAGS="-g3 -O0"; make fork
A>cc -g3 -O0 fork.c -o fork
A>[alexsy@localhost64 fork]$ gdb ./fork --silent
A>Using host libthread_db library "/lib64/libthread_db.so.1".
A>(gdb) list
A>1 #include <stdio.h>
A>2 #include <unistd.h>
A>3 #include <sys/types.h>
A>4
A>5 int main()
A>6 {
A>7 printf("Hello world!\n");
A>8 pid_t id;
A>9 id = fork();
A>10 if(!id)
A>(gdb)
A>11 {
A>12 sleep(30);
A>13 printf("Fork\n");
A>14 }
A>15 else
A>16 printf("No Fork\n");
A>17 return 0;
A>18 }
A>(gdb) breac 12
A>Undefined command: "breac". Try "help".
A>(gdb) break 12
A>Breakpoint 1 at 0x400548: file fork.c, line 12.
A>(gdb) run
A>Starting program: /home/alexsy/temp/fork/fork
A>Hello world!
A>[Detaching after fork from child process 3815. (Try `set detach-on-fork off'.)]
A>No Fork

A>Program exited normally.

A>(gdb) set detach-on-fork off
A>(gdb) run
A>Starting program: /home/alexsy/temp/fork/fork
A>Hello world!
A>No Fork

A>Program exited normally.

A>[Switching to process 3817]
A>(gdb) Fork

A>(gdb) step

A>Single stepping until exit from function fork,
A>which has no line number information.
A>main () at fork.c:10
A>10 if(!id)
A>(gdb)

A>Breakpoint 1, main () at fork.c:12

A>12 sleep(30);
A>(gdb)
A>13 printf("Fork\n");
A>(gdb)
A>Fork
A>17 return 0;
A>(gdb)
A>18 }
A>(gdb)
A>0x00007f41ba5baab4 in __libc_start_main () from /lib64/libc.so.6
A>(gdb)
A>Single stepping until exit from function __libc_start_main,
A>which has no line number information.

A>Program exited normally.

A>(gdb) quit
A>[alexsy@localhost64 fork]$ gdb --version
A>GNU gdb Red Hat Linux (6.6-16rh)
A>Copyright (C) 2006 Free Software Foundation, Inc.
A>GDB is free software, covered by the GNU General Public License, and you are
A>welcome to change it and/or distribute copies of it under certain conditions.
A>Type "show copying" to see the conditions.
A>There is absolutely no warranty for GDB. Type "show warranty" for details.
A>This GDB was configured as "x86_64-redhat-linux-gnu".
A>[alexsy@localhost64 fork]$


Тоже самое получается.
Re: gdb и fork
От: EinDeveloper  
Дата: 03.11.08 09:34
Оценка:
Здравствуйте, Taurus, Вы писали:

T>Есть некая программа которая при работе вызывает кучу модулей. Вызваются они комбинацией vfork/exec. Далее через шеловский скрипт открывается сам модуль, и если нужно то с отладчиком. Как привязать отладчик к самой программе так чтобы он отслеживал запуски этих модулей и сам к ним привязывался? gdb вроде как сказано в документации поддерживает работу с форками и должен сам их перехватывать.


В GDB вроде бы есть команды show follow-fork-mode, set follow-fork-mode child.
Р.S. Давно уже с этим не работал, поэтому могу что-то путать. Попробуйте.
Re[2]: gdb и fork
От: Taurus Россия  
Дата: 03.11.08 11:03
Оценка:
Здравствуйте, EinDeveloper, Вы писали:

ED>В GDB вроде бы есть команды show follow-fork-mode, set follow-fork-mode child.

ED>Р.S. Давно уже с этим не работал, поэтому могу что-то путать. Попробуйте.

Пробовал. С этой командой он переходить на child, но при этом отвязывается от parent. Мне же надо что бы parent не терялся.
Re[3]: gdb и fork
От: EinDeveloper  
Дата: 03.11.08 12:08
Оценка:
Здравствуйте, Taurus, Вы писали:

T>Здравствуйте, EinDeveloper, Вы писали:


ED>>В GDB вроде бы есть команды show follow-fork-mode, set follow-fork-mode child.

ED>>Р.S. Давно уже с этим не работал, поэтому могу что-то путать. Попробуйте.

T>Пробовал. С этой командой он переходить на child, но при этом отвязывается от parent. Мне же надо что бы parent не терялся.


Слышал, что GDB не очень хорошо работает с многопоточностью (как и все отладчики построенные на основе ptrace).
В случаях, когда это важно, лучше использовать спец. отладчики. Например, TotalView.
Так ли это, не знаю, сам не пользовался.
Re[4]: gdb и fork
От: Taurus Россия  
Дата: 03.11.08 12:24
Оценка:
Здравствуйте, EinDeveloper, Вы писали:

ED>Слышал, что GDB не очень хорошо работает с многопоточностью (как и все отладчики построенные на основе ptrace).

ED>В случаях, когда это важно, лучше использовать спец. отладчики. Например, TotalView.
ED>Так ли это, не знаю, сам не пользовался.

totalview его покупать надо. А что-нибудь бесплатное есть?
Re[5]: gdb и fork
От: EinDeveloper  
Дата: 03.11.08 13:16
Оценка:
Здравствуйте, Taurus, Вы писали:

T>Здравствуйте, EinDeveloper, Вы писали:


ED>>Слышал, что GDB не очень хорошо работает с многопоточностью (как и все отладчики построенные на основе ptrace).

ED>>В случаях, когда это важно, лучше использовать спец. отладчики. Например, TotalView.
ED>>Так ли это, не знаю, сам не пользовался.

T>totalview его покупать надо. А что-нибудь бесплатное есть?

не знаю.
Re[3]: gdb и fork
От: Аноним  
Дата: 04.11.08 05:21
Оценка:
Здравствуйте, Taurus, Вы писали:

T>Здравствуйте, EinDeveloper, Вы писали:


ED>>В GDB вроде бы есть команды show follow-fork-mode, set follow-fork-mode child.

ED>>Р.S. Давно уже с этим не работал, поэтому могу что-то путать. Попробуйте.

T>Пробовал. С этой командой он переходить на child, но при этом отвязывается от parent. Мне же надо что бы parent не терялся.



Хмм ... "Мне же надо что бы parent не терялся." по твоей програме "


#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
  printf("Hello world!\n");
  pid_t id;
  id = fork();
  if(!id)
  {
    sleep(30);
    printf("Fork\n");
  }
  else
    printf("No Fork\n");
  return 0;
}

Именно так и должно получатся.. Пака чилд весит на паузе, парент заканчивает свою работу. Чилд переходит по юрездикцию INIT.
Если ты в паренте хочеш дождаться чилд, то добавь системный вызов wait в парент.
Re[4]: gdb и fork
От: Taurus Россия  
Дата: 04.11.08 06:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Taurus, Вы писали:


T>>Здравствуйте, EinDeveloper, Вы писали:


ED>>>В GDB вроде бы есть команды show follow-fork-mode, set follow-fork-mode child.

ED>>>Р.S. Давно уже с этим не работал, поэтому могу что-то путать. Попробуйте.

T>>Пробовал. С этой командой он переходить на child, но при этом отвязывается от parent. Мне же надо что бы parent не терялся.



А>Хмм ... "Мне же надо что бы parent не терялся." по твоей програме "


А>

А>#include <stdio.h>
А>#include <unistd.h>
А>#include <sys/types.h>

А>int main()
А>{
А>  printf("Hello world!\n");
А>  pid_t id;
А>  id = fork();
А>  if(!id)
А>  {
А>    sleep(30);
А>    printf("Fork\n");
А>  }
А>  else
А>    printf("No Fork\n");
А>  return 0;
А>}

А>

А>Именно так и должно получатся.. Пака чилд весит на паузе, парент заканчивает свою работу. Чилд переходит по юрездикцию INIT.
А>Если ты в паренте хочеш дождаться чилд, то добавь системный вызов wait в парент.

Я не хочу дождаться чилд. Я хочу чтоб gdb одновременно контролировал и чилд и парент.
Re: gdb и fork
От: dont.avt Украина  
Дата: 05.11.08 11:38
Оценка:
Здравствуйте, Taurus, Вы писали:

T>
T>(gdb) b 16
T>Breakpoint 1 at 0x80483f9: file main.c, line 16.
T>(gdb) run 
T>Starting program: /root/dev/forks/main 
T>Hello world!

T>Breakpoint 1, main () at main.c:16
T>16          printf("No Fork\n");
T>(gdb) info forks
T>No forks.
T>(gdb) c
T>Continuing.
T>No Fork

T>Program exited normally.
T>(gdb) Fork
T>


А что по-вашему должно происходить?
Re[2]: gdb и fork
От: Taurus Россия  
Дата: 05.11.08 16:34
Оценка:
Здравствуйте, dont.avt, Вы писали:

DA>Здравствуйте, Taurus, Вы писали:


T>>
T>>(gdb) b 16
T>>Breakpoint 1 at 0x80483f9: file main.c, line 16.
T>>(gdb) run 
T>>Starting program: /root/dev/forks/main 
T>>Hello world!

T>>Breakpoint 1, main () at main.c:16
T>>16          printf("No Fork\n");
T>>(gdb) info forks
T>>No forks.
T>>(gdb) c
T>>Continuing.
T>>No Fork

T>>Program exited normally.
T>>(gdb) Fork
T>>


DA>А что по-вашему должно происходить?


Спасибо )) разобрался надо было делать
set detach-on-fork off. (вроде в доках написано что она отключена по умолчанию)
А надо было что бы gdb привязывался к обоим процессам.
Тогда другой вопрос, в случае с fork он работает на ура, но в случае с vfork
повисает, можно кнопки нажимать, в терминале даже что то появляться будет, но завершить нельзя, комманды gdb вызывать нельзя. Если закрыть терминал открыть другой и сделать ps -A | grep main то будут два процесса main, которые причем по kill не убиваются.
Re[3]: gdb и fork
От: ДимДимыч Украина http://klug.org.ua
Дата: 05.11.08 16:51
Оценка:
Здравствуйте, Taurus, Вы писали:

T>Тогда другой вопрос, в случае с fork он работает на ура, но в случае с vfork

T>повисает, можно кнопки нажимать, в терминале даже что то появляться будет, но завершить нельзя, комманды gdb вызывать нельзя.

Скорее всего потому что gdb отслеживает родителя, а он висит в ядре в ожидании завершения или exec'а дочернего процесса.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[4]: gdb и fork
От: Taurus Россия  
Дата: 05.11.08 17:21
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Здравствуйте, Taurus, Вы писали:


T>>Тогда другой вопрос, в случае с fork он работает на ура, но в случае с vfork

T>>повисает, можно кнопки нажимать, в терминале даже что то появляться будет, но завершить нельзя, комманды gdb вызывать нельзя.

ДД>Скорее всего потому что gdb отслеживает родителя, а он висит в ядре в ожидании завершения или exec'а дочернего процесса.


я ему прямым текстом указывал куда идти
set follow-fork-mode child
set detach-on-fork off
а может кто нибудь у себя посмотреть как это будет работать в случае с vfork ?
Re[5]: gdb и fork
От: ДимДимыч Украина http://klug.org.ua
Дата: 06.11.08 19:19
Оценка:
Здравствуйте, Taurus, Вы писали:

T>а может кто нибудь у себя посмотреть как это будет работать в случае с vfork ?


А чего нужно в итоге добиться, отлаживать как родительский, так и дочерний процессы?
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[6]: gdb и fork
От: Taurus Россия  
Дата: 06.11.08 19:24
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Здравствуйте, Taurus, Вы писали:


T>>а может кто нибудь у себя посмотреть как это будет работать в случае с vfork ?


ДД>А чего нужно в итоге добиться, отлаживать как родительский, так и дочерний процессы?


Да это и нужно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.