Всем привет!
Вот такая вот странность: При отладке даже примитивного многопоточного приложения:
1 #include <stdio.h>
2 #include <pthread.h>
3 #define log_on 1
4
5 void* potok(void*);
6
7 int main(int argv,char**argc)
8 {
9 printf("?????");
10 pthread_t handl;
11
12 if(pthread_create(&handl,0,&potok,0))
13 puts("\nerror\n");
14 return 0;
15 }
16
17 void* potok(void*uk)
18 {
19 puts("\n?????");
20 return (void*)0;
21 }начали вываливаться такие ошибки:
(gdb) b 14
Breakpoint 1 at 0x804852d: file main.cpp, line 14.
(gdb) b potok(void*)
Breakpoint 2 at 0x804853a: file main.cpp, line 19.
(gdb) r
Starting program: /data/work/Linux/work_c/tcp/temp/mainProgram received signal SIG32, Real-time event 32.
0x4017d2e1 in sigpending () from /lib/libc.so.6
(gdb) n
Single stepping until exit from function sigpending,
which has no line number information.
0x40028ec0 in pthread_yield () from /lib/libpthread.so.0
(gdb) n
Single stepping until exit from function pthread_yield,
which has no line number information.
0x40025649 in pthread_getattr_np () from /lib/libpthread.so.0
(gdb) n
Single stepping until exit from function pthread_getattr_np,
which has no line number information.
0x40028ece in pthread_yield () from /lib/libpthread.so.0
(gdb) n
Single stepping until exit from function pthread_yield,
which has no line number information.
0x400297e0 in pthread_getconcurrency () from /lib/libpthread.so.0
(gdb) n
Single stepping until exit from function pthread_getconcurrency,
which has no line number information.
0x40025649 in pthread_getattr_np () from /lib/libpthread.so.0
(gdb) n
Single stepping until exit from function pthread_getattr_np,
which has no line number information.
0x400297f0 in pthread_getconcurrency () from /lib/libpthread.so.0
(gdb)
и т.д. В чём странность - непонятно. При запуске вне gdb - всё работает нормально. В чём может быть проблема? Хотя проблема-то видна... :-) Но что енто значит?
Похоже на глюки отладчика. Обычно проявляются, скажем, в Linux,
когда glibc сильно старая, а ядро сильно новое.На всякий случай - `info threads` и `bt` для текущего потока
в студию.
Вот:
(gdb) b 14
Breakpoint 1 at 0x804852d: file main.cpp, line 14.
(gdb) b potok(void*)
Breakpoint 2 at 0x804853a: file main.cpp, line 19.
(gdb) r
Starting program: /data/work/Linux/work_c/tcp/temp/mainProgram received signal SIG32, Real-time event 32.
0x4017d2e1 in sigpending () from /lib/libc.so.6
(gdb) n
Single stepping until exit from function sigpending,
which has no line number information.
0x40028ec0 in pthread_yield () from /lib/libpthread.so.0
(gdb) info threads
(gdb) info threads
(gdb) bt
#0 0x40028ec0 in pthread_yield () from /lib/libpthread.so.0
#1 0x4017d3a7 in sigsuspend () from /lib/libc.so.6
#2 0x40029258 in pthread_getconcurrency () from /lib/libpthread.so.0
#3 0x40028ac5 in pthread_create () from /lib/libpthread.so.0
#4 0x08048516 in main (argv=1, argc=0xbffff644) at main.cpp:12
(gdb)
Из напечатанного видно, что оный странный сигнал прилетает в момент
попытки создания потока.То, что info threads ни шиша не печатает, наводит на своеобразные
мысли. Поэтому впрос из разряда дурацких: употребляется ли ключик
`-pthread` при компиляции?Ещё возникает подозрение, что отладчик собран без поддержки средств
отладки многопоточных программ. Либо просто собран криво. Можно
попробовать собрать из сорсов, причём тщательно проверить вывод
`configure`.
>Из напечатанного видно, что оный странный сигнал прилетает в момент
>попытки создания потока.
>
>То, что info threads ни шиша не печатает, наводит на своеобразные
>мысли. Поэтому впрос из разряда дурацких: употребляется ли ключик
>`-pthread` при компиляции?
>
>Ещё возникает подозрение, что отладчик собран без поддержки средств
>отладки многопоточных программ. Либо просто собран криво. Можно
>попробовать собрать из сорсов, причём тщательно проверить вывод
>`configure`.Программа собрана нормально, с -lpthread, на соседней машине (ASP 9.2) всё отлаживается нормально. Дебаггер из дистрибутива (Слакваре 10.0). Ставил со Слакваре 9.0 - всё равно не работает (поведение то же), хотя когда у меня стаяла Слакварь 9.0 - прога отлаживалась "на-ура". Похоже это в дистре... Но у людей-то наверно работает... :-( Причём ведь на дефолтном ядре - та же история...
PS: то что info threads не печатает, это т.к. оно похоже вывалилось, не создав потока похоже...
>Программа собрана нормально, с -lpthread, на соседней машине (ASP 9.2)При компиляции (не при линковке) `-pthread` выставлен? Не `-lpthread`,
а `-pthread` - разные это вещи.>PS: то что info threads не печатает, это т.к. оно похоже вывалилось,
>не создав потока похоже...Главный поток должно было напечатать.
>При компиляции (не при линковке) `-pthread` выставлен? Не `-lpthread`,
>а `-pthread` - разные это вещи.Пропробовал - то же самое:
bash-2.05b$ make
g++ -g3 -c -pthread main.cpp -o main.o
g++ -g3 -lpthread main.o -o main
bash-2.05b$ gdb mai
main main.cpp main.o
bash-2.05b$ gdb main
GNU gdb 5.3
Copyright 2002 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 "i386-slackware-linux"...
(gdb) b 14
Breakpoint 1 at 0x804852d: file main.cpp, line 14.
(gdb) b potok(void*)
Breakpoint 2 at 0x804853a: file main.cpp, line 19.
(gdb) r
Starting program: /data/work/Linux/work_c/tcp/temp/mainProgram received signal SIG32, Real-time event 32.
0x4017d2e1 in sigpending () from /lib/libc.so.6
(gdb) info threads
(gdb)Да и раньше оно без этой опции работало (на 9.0 слакваре), да и сейчас всё нормально отлаживается на ASP 9.2, а вот на 10-й слаке такие странности.
>Похоже на глюки отладчика. Обычно проявляются, скажем, в Linux,
>когда glibc сильно старая, а ядро сильно новое.
>
>На всякий случай - `info threads` и `bt` для текущего потока
>в студию.В догонку:
Ядро 2.4.29
glibc 2.3.3
Slackware 10.0
>>Похоже на глюки отладчика. Обычно проявляются, скажем, в Linux,
>>когда glibc сильно старая, а ядро сильно новое.
>>
>>На всякий случай - `info threads` и `bt` для текущего потока
>>в студию.
>
>В догонку:
>Ядро 2.4.29
>glibc 2.3.3
>Slackware 10.0Ссори - glibc 2.3.2
Проверил на дефолтном для 10 Слаки ядре - то же самое. поставил постарше дебаггер (5-й, у меня 6-й) - то же самое. На ASP 9.2 glibc 2.3.2 ядро 2.4.22 - всё работает нормально... Вот и думаю - что делать?!
А чёрт знает что такое. У меня Slackware 10 + ядро 2.6.9 --- тоже самое. Но поток то запускается! Просто из pthread_create не выйти под дебуггером.
В доках про gdb написано, ежели info threads ничего не пишет ==> нету поддержки threads (надо перекомпилять gdb)
>А чёрт знает что такое. У меня Slackware 10 + ядро 2.6.9
>--- тоже самое. Но поток то запускается! Просто из pthread_create не
>выйти под дебуггером.Нашёл в чём бага! :-) Побродил по буржуйским сайтам и нашёл. В общем проблема в том, что в слаке по-умолчанию из glibc-ов после сборки удаляется отладочная информация, что уменьшает размер библиотек. Этим занимается утилита strip <файл>. чтобы проверить есть ли там инфа нужно дать команду - для нашего случая к примеру:
file /lib/libpthread*
Если там будет наличиствовать 'stripped' то тогда проблема есть, и надо компилить с сырцов. Но при этом надо поправить build-скрипт и закомментить там strip команды.
Вроде как, для этих целей служит glibc-debug, но там тоже stripped... :-(ЗЫ: пересобрал glibc-ы по пофикшенному скрипту (заодно под камешек свой) и всё наконец-то заработало. Чего и вам желаю! :-)