Страниц: [1]
  Печать  
Автор Тема: ... на уровне астрала ...  (Прочитано 5652 раз)
Wlad
Участник
*
Offline Offline

Сообщений: 3


Просмотр профиля
« : Января 09, 2006, 11:16:28 pm »

Тут однажды один участник (по-моему, mike), поместил очень удачную фразу о состоянии программиста, когда последний не может понять, почему программа не выполняет очевидные вещи в правильном коде:
"... ну, думал - всё, - допрограммировался ..."
;о)
Вот что меня сподвигнуло эти слова вспомнить:


// proba.cpp
#include <iostream>
#include <pthread.h>

class Activity_t
{public:                            
    void Start();
    static void* ActivityThreadFunc ( void* );
};
//static
void* Activity_t::ActivityThreadFunc ( void* )
{
    return NULL;
}
void Activity_t::Start()
{
    pthread_create( NULL, NULL, &Activity_t::ActivityThreadFunc, NULL );
}

int main()
{
    cout << "===========" << endl;
    try { throw 23; }
    catch(...) { cout << "rrrrrrrrrrrrrrr" << endl; }
    cout << "-------------------" << endl;

    return 0;
}


Это – результат "продирания" сквозь код и "отбрасывания лишнего"...
Рекомендую откомпилировать в четырёх вариантах:

комментируя и оставляя вызов pthread_create() в каждом из вариантов сборки:
g++  -fexceptions  -o proba proba.cpp
g++  -fexceptions  -o proba proba.cpp  -static

Тип исключения значения не имеет...
(QNX 6.2.1 gcc 2.95.3)
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #1 : Января 10, 2006, 09:13:44 am »

Не знаю, что тут загадочного, просто +1 еще ошибка в QNX6. Nothing special.

При статической линковке нельзя совмествно использовать исключения и потоки.

1) Шаманство с комментированием pthread ведет к тому, компилятор и линковщик обрабатывает появление pthread_* в коде специфическим образом и в зависимости есть ли использование pthread или нет вызывает тот или иной фрагмент кода runtime.

2) Если запустить gdb proba proba.core то прекрасно видно, что падает на вызове pthread_once() - инициализация dynamic part, в static режиме ее вызывать нельзя. При статической линковке такого вызова не должно быть.
Записан

lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #2 : Января 10, 2006, 09:32:38 am »

Я отписал PR.
Записан

lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #3 : Января 10, 2006, 06:06:28 pm »

Actually, I think it's a linker bug. I believe there's some pthread routines declared weak (an undefined) in the C++ exception code; and when you link static, the linker gives up as soon as it sees them. (stuffs the address with 0, and you segv when they're called)

Garry.
Записан

Wlad
Участник
*
Offline Offline

Сообщений: 3


Просмотр профиля
« Ответ #4 : Января 15, 2006, 01:26:14 pm »

lestat
and you segv when they're called
Наверное я с английского неправильно перевожу...
Вызова этих функций нет, следовательно, никаким макаром они в стеке вызовов не присутствуют... Просто включение или не включение этой функции в текст программы приводит к тому или иному поведению при throw.
Кроме того, где прочитать вот про это:
lestat
some pthread routines declared weak (an undefined) in the C++ exception code
?
Что означает в данном случае сам термин weak применительно к механизму обработки исключений?
И вот по этому вопрос ("не обессудьте, доктор, за назойливасть - очень чешется..." ;о) ):
lestat
2) Если запустить gdb proba proba.core то прекрасно видно, что падает на вызове pthread_once() - инициализация dynamic part, в static режиме ее вызывать нельзя. При статической линковке такого вызова не должно быть.
Как вы в отладчике увидели падение на pthread_once? По bt я увидел только обращение к какой-то внутренней служебной (видимо, связанной с раскруткой стека) функции, но с разыменованием по нулевому адресу...
Пардон за отнятое время.
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #5 : Января 16, 2006, 09:29:45 am »

Wlad
Вызова этих функций нет, следовательно, никаким макаром они в стеке вызовов не присутствуют...

Ну как это нет, я же вверху написал, что корка упала при вызове pthread_once().
Wlad
Кроме того, где прочитать вот про это:

http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html -> поиск weak. два раза.
http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.  doc/compiler/ref/rnpgweak.htm - ничего, что по AIX'у, зато очень хорошо описано, с той разницей, что в GCC это не прагма, а аттрибут (правда может и прагма есть, лень смотреть).
Wlad
Что означает в данном случае сам термин weak применительно к механизму обработки исключений?

Никаким боком оно к нему не относится.
Wlad
Как вы в отладчике увидели падение на pthread_once? По bt я увидел только обращение к какой-то внутренней служебной (видимо, связанной с раскруткой стека) функции, но с разыменованием по нулевому адресу...

Наверное потому, что в 6.3 SP2 ?
Записан

lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #6 : Января 16, 2006, 09:32:20 am »

Да, забыл сказать, бага исправляться не будет. 2.95.3 -> outdated compiler.
Записан

Wlad
Участник
*
Offline Offline

Сообщений: 3


Просмотр профиля
« Ответ #7 : Января 16, 2006, 10:09:17 am »

lestat
я же вверху написал, что корка упала при вызове pthread_once()
Я имел в виду, что я не вызывал... :о)
lestat... outdated ...
Теперь остаётся с начальниками душевно говорить... :о)

Спасибо.
Записан
Страниц: [1]
  Печать  
 
Перейти в: