[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: отладка под gdb



Vasily Titsky <winner@tsure.ru> wrote:
> Привет.

> Столкнулся со странным поведенем программы, запускаемой из отладчика 
> (под gdb). Начал выяснять. Обнаружилось, что если в программе есть 
> несколько нитей, то при "хождении по шагам" нити могут просыпаться, хотя 
> они сидят на вызове sem_wait(&sema), а сам "sema" - ещё имеет нулевой 
> счетчик.

> Удивился. Погуглил. Оказывается, с этой проблемой сталкиваются многие, и 
> происходить это может не только под отладчиком (например, запускаем 
> программу, Ctrl-Z, затем fg. Всё, если были нити, которые сидят на 
> семафорах, то они начтут выполняться).

> Обход это проблемы тоже был более-менее одинаков - вместо sema_wait() 
> делаем что-то типа "while(sema_wait()==-1);". Документация, оказывается, 
> не соответствует действительности.

> Сделал. Проблема ушла. Частично. Теперь уход в background/вывод в 
> foreground происходит корректно. Но. Под отладчиком теперь получаем такое:
> Program received signal SIGSEGV, Segmentation fault.

> Напоследок проверил отладку под insight - версия в sarge просто 
> отказалась отлаживать эту программу.

> Всё. Приплыли. Как вообще можно отлаживать программы - непонятно.
я бы сказал - как вообще с помошью gdb можно отлаживать программы -
непонятно. 

Breakpoint 1, main () at test.c:33
33              ret=sem_init (&global_S, 0, 0);
(gdb) n
34              if (ret) goto fail;
(gdb)
37              if (pthread_create(&thread_id, NULL,
(gdb)
[New Thread -1210344528 (LWP 11002)]
59              return 0;
(gdb)
37              if (pthread_create(&thread_id, NULL,
(gdb)
1
50                              rc=sem_wait(&global_S);
(gdb)
2
3
[Thread -1210344528 (LWP 11002) exited]
51                      } while(rc==-1);
(gdb)
55              ret=sem_destroy(&global_S);
(gdb)
56              if (ret) goto fail;
(gdb)
58              printf("all ok\n");
(gdb)
all ok
64      }
(gdb)
0xb7dcfeb0 in __libc_start_main () from /lib/tls/libc.so.6
(gdb)

и чего я должен был увидеть ?

GNU gdb 6.4-debian
gcc version 4.0.3 (Debian 4.0.3-1)
libpthread-2.3.6

при простом запуске:
$ ./a.out
1
2
3
all ok




Reply to: