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: