LINUX.ORG.RU

[C++] Странная проблема с localtime_r и семафорами

 


0

0

Привет!

Есть довольно большой проект на C++, в котором ни с того, ни с сего
перестали работать семафоры (используем обертку ACE_Thread_Semaphore).
Долго сидел и искал ошибку. В итоге написал маленький пример на
полстраницы, который демонстрирует проблему:

////////////////////////////////////////////////////////////////////

#include <iostream>
#include <cassert>

#include <ace/Thread_Semaphore.h>

extern "C"
{
#include <time.h>
}

int main(int argc, char** argv)
{
if(argc > 1)
{
const time_t current_unix_time = ::time(NULL);
assert(current_unix_time != -1);

struct tm tm_, *ptm;
ptm = ::localtime_r(&current_unix_time, &tm_);
assert(ptm);
assert(ptm == &tm_);

std::cout << "UNIX time = " << current_unix_time << ", Local time = "
<< 1900 + ptm->tm_year << "-" << 1 + ptm->tm_mon << "-" << ptm->tm_mday
<< " " << ptm->tm_hour << ":" << ptm->tm_min << ":" << ptm->tm_sec << std::endl;
}

ACE_Thread_Semaphore sem(0);
std::cout << "Before acquiring the semaphore. We must hang here since current value of semaphore is 0." << std::endl;
int r = sem.acquire();
std::cout << "After acquiring the semaphore. r = " << r << ". " << strerror(errno) << std::endl;

return 0;
}

////////////////////////////////////////////////////////////////////

Собираю следующей командой:

g++-4.3.2 -g -I /usr/local/dev/ace-5.6.7/include/ -L /usr/local/dev/ace-5.6.7/lib/ -pthread -lACE main.cpp

Итак, в чем же проблема (точнее как она проявляется).
1) Сначала запустим программу без параметров:

krivenok@develop2 13:29:32 /tmp/strange $ ./a.out
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
krivenok@develop2 13:30:24 /tmp/strange $

Как и ожидалось мы блокируемся на семафоре.

2) Теперь запустим программу с параметрами (argc > 1):

krivenok@develop2 13:30:24 /tmp/strange $ ./a.out 1
UNIX time = 1238405487, Local time = 2009-3-30 13:31:27
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
After acquiring the semaphore. r = -1. Function not implemented
krivenok@develop2 13:31:27 /tmp/strange $


Если в первом случае в выводе strace видим:

write(1, "Before acquiring the semaphore. W"..., 89Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
) = 89
futex(0x804f750, FUTEX_WAIT, 0, NULL^C <unfinished ...>


То во втором:

write(1, "Before acquiring the semaphore. W"..., 89Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
) = 89
futex(0x804f7e8, 0xb7cbb170 /* FUTEX_??? */, 0) = -1 ENOSYS (Function not implemented)
write(1, "After acquiring the semaphore. r "..., 64After acquiring the semaphore. r = -1. Function not implemented
) = 64

То есть в вызов futex передается мусор.

Есть идеи в чем проблема?
Может я где-то сильно туплю и не вижу очевидного?

Мои эксперименты показывают, что причина проблемы - вызов
функции localtime_r (пробовал и localtime, и gmtime[_r]).
Если ее убрать, что все работает как ожидалось.

Кстати, обнаружилась проблема после обновления glibc
с версии 2.6.1 до 2.8.

Параметры системы:
1) gcc

krivenok@develop2 13:37:34 /tmp/strange $ g++-4.3.2 --version
g++-4.3.2 (GCC) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

krivenok@develop2 13:37:39 /tmp/strange $

2) glibc

krivenok@develop2 13:37:39 /tmp/strange $ ls -al /lib/libc.so.6
lrwxrwxrwx 1 root root 11 Мар 28 15:31 /lib/libc.so.6 -> libc-2.8.so
krivenok@develop2 13:38:30 /tmp/strange $

3) ACE

5.6.7

Всем заранее спасибо за помощь!

> Кстати, обнаружилась проблема после обновления glibc с версии 2.6.1 до 2.8.

А новая версия glibc не хочет новую версию ядра?

mv ★★★★★
()
Ответ на: комментарий от mv

> А новая версия glibc не хочет новую версию ядра?

Судя по дате выхода ядра 2.6.24, которое мы используем:

commit 49914084e797530d9baaf51df9eda77babc98fa8
Author: Linus Torvalds <torvalds@woody.linux-foundation.org>
Date:   Thu Jan 24 14:58:37 2008 -0800

    Linux 2.6.24

и дате выхода glibc-2.8:

2008-04-17

вероятность этого есть.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Скомпилировал программу на другом сервере с последним ядром:

proxy strange # uname -a
Linux proxy 2.6.29-gentoo #1 SMP Sat Mar 28 17:20:13 MSK 2009 i686 Intel(R) Celeron(R) CPU 2.53GHz GenuineIntel GNU/Linux
proxy strange #

другой версией gcc:

proxy strange # gcc --version
gcc (GCC) 4.1.2 (Gentoo 4.1.2 p1.3)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

proxy strange # 

и тем же glibc:

proxy strange # ls -l /lib/libc.so.6 
lrwxrwxrwx 1 root root 11 Mar 29 19:25 /lib/libc.so.6 -> libc-2.8.so
proxy strange # 

Результат тот же:

proxy strange # ./a.out 
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
proxy strange # ./a.out 1
UNIX time = 1238417381, Local time = 2009-3-30 16:49:41
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
After acquiring the semaphore. r = -1. Function not implemented
proxy strange # 

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Запустил программу еще на одном сервере с более старым ядром:

equipment@bill 16:36:06 /tmp $ uname -a
Linux bill 2.6.23-gentoo-r3 #7 SMP Tue Apr 15 14:26:03 MSD 2008 i686 Intel(R) Xeon(R) CPU E5345 @ 2.33GHz GenuineIntel GNU/Linux
equipment@bill 16:36:18 /tmp $ 

С glibc-2.6.1:

equipment@bill 16:36:21 /tmp $ ls -l /lib/libc.so.6 
lrwxrwxrwx 1 root root 13 Янв 24  2008 /lib/libc.so.6 -> libc-2.6.1.so
equipment@bill 16:36:37 /tmp $ 

и gcc-4.1.2:

equipment@bill 16:36:39 /tmp $ gcc --version
gcc (GCC) 4.1.2 (Gentoo 4.1.2 p1.0.2)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

equipment@bill 16:36:44 /tmp $ 

Все работает верно:

equipment@bill 16:36:50 /tmp $ ./a.out 
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.

equipment@bill 16:36:57 /tmp $ ./a.out 1
UNIX time = 1238416621, Local time = 2009-3-30 16:37:1
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.

equipment@bill 16:37:06 /tmp $ 


Не знаю что и думать :(

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Fedora Rawhide, 2.6.29, gcc version 4.4.0 20090328 (Red Hat 4.4.0-0.30) (GCC), glibc 2.9.90, ace 5.6.8

...
futex(0x21308a0, FUTEX_WAIT_PRIVATE, 0, NULL^C <unfinished ...>

оно же с -e raw=all

futex(0x15028a0, 0x80, 0, 0, 0, 0x7ff529acd710^C <unfinished ...>

mv ★★★★★
()
Ответ на: комментарий от mv

Очень интересно.
Мы используем Gentoo и на всех серверах где я проверял, второй
вариант не работал на glibc-2.8.

Попробую собрать glibc-2.9 как у тебя.
Может что-то изменится.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Коллега собрал вот на такой системе:

$ uname -a
Linux badger 2.6.27-14-generic #1 SMP Fri Mar 13 18:00:20 UTC 2009 i686 GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 8.10
Release: 8.10
Codename: intrepid

$ apt-cache show libc6|grep Version -B1 
Source: glibc
Version: 2.8~20080505-0ubuntu9

Получил то же самое:

$ ./a.out 
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C

$ ./a.out 123
UNIX time = 1238428884, Local time = 2009-3-30 20:1:24
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
After acquiring the semaphore. r = -1. Function not implemented

Похоже что-то не то с glibc-2.8.

А glibc-2.9 не собирается суцко:

gcc-4.3.2   -shared -static-libgcc -Wl,-O1  -Wl,-z,defs -Wl,-dynamic-linker=/usr/local/dev/glibc-2.9/lib/ld-linux.so.2  -B/home/krivenok/dev_builds/glibc-2.9_obj/csu/  -Wl,--version-script=/home/krivenok/dev_builds/glibc-2.9_obj/libc.map -Wl,-soname=libc.so.6 -Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both -nostdlib -nostartfiles -e __libc_main -L/home/krivenok/dev_builds/glibc-2.9_obj -L/home/krivenok/dev_builds/glibc-2.9_obj/math -L/home/krivenok/dev_builds/glibc-2.9_obj/elf -L/home/krivenok/dev_builds/glibc-2.9_obj/dlfcn -L/home/krivenok/dev_builds/glibc-2.9_obj/nss -L/home/krivenok/dev_builds/glibc-2.9_obj/nis -L/home/krivenok/dev_builds/glibc-2.9_obj/rt -L/home/krivenok/dev_builds/glibc-2.9_obj/resolv -L/home/krivenok/dev_builds/glibc-2.9_obj/crypt -L/home/krivenok/dev_builds/glibc-2.9_obj/nptl -Wl,-rpath-link=/home/krivenok/dev_builds/glibc-2.9_obj:/home/krivenok/dev_buil
ds/glibc-2.9_obj/math:/home/krivenok/dev_builds/glibc-2.9_obj/elf:/home/krivenok
/dev_builds/glibc-2.9_obj/dlfcn:/home/krivenok/dev_builds/glibc-2.9_obj/nss:/hom
e/krivenok/dev_builds/glibc-2.9_obj/nis:/home/krivenok/dev_builds/glibc-2.9_obj/
rt:/home/krivenok/dev_builds/glibc-2.9_obj/resolv:/home/krivenok/dev_builds/glib
c-2.9_obj/crypt:/home/krivenok/dev_builds/glibc-2.9_obj/nptl -o /home/krivenok/dev_builds/glibc-2.9_obj/libc.so -T /home/krivenok/dev_builds/glibc-2.9_obj/shlib.lds /home/krivenok/dev_builds/glibc-2.9_obj/csu/abi-note.o /home/krivenok/dev_builds/glibc-2.9_obj/elf/soinit.os /home/krivenok/dev_builds/glibc-2.9_obj/libc_pic.os /home/krivenok/dev_builds/glibc-2.9_obj/elf/sofini.os /home/krivenok/dev_builds/glibc-2.9_obj/elf/interp.os /home/krivenok/dev_builds/glibc-2.9_obj/elf/ld.so -lgcc
/home/krivenok/dev_builds/glibc-2.9_obj/libc_pic.os: In function `__libc_fork':
/home/krivenok/dev_builds/glibc-2.9/posix/../nptl/sysdeps/unix/sysv/linux/i386/
../fork.c:79: undefined reference to `__sync_bool_compare_and_swap_4'
/home/krivenok/dev_builds/glibc-2.9_obj/libc_pic.os: In function `nscd_getpw_r':
/home/krivenok/dev_builds/glibc-2.9/nscd/nscd_getpw_r.c:232: undefined reference to `__sync_fetch_and_add_4'
/home/krivenok/dev_builds/glibc-2.9_obj/libc_pic.os: In function `__nscd_drop_map_ref':
/home/krivenok/dev_builds/glibc-2.9/nscd/nscd-client.h:320: undefined reference to `__sync_fetch_and_add_4'
/home/krivenok/dev_builds/glibc-2.9_obj/libc_pic.os: In function `nscd_getgr_r':
/home/krivenok/dev_builds/glibc-2.9/nscd/nscd_getgr_r.c:321: undefined reference to `__sync_fetch_and_add_4'
/home/krivenok/dev_builds/glibc-2.9_obj/libc_pic.os: In function `__nscd_drop_map_ref':
/home/krivenok/dev_builds/glibc-2.9/nscd/nscd-client.h:320: undefined reference to `__sync_fetch_and_add_4'
/home/krivenok/dev_builds/glibc-2.9_obj/libc_pic.os: In function `nscd_gethst_r':
/home/krivenok/dev_builds/glibc-2.9/nscd/nscd_gethst_r.c:400: undefined reference to `__sync_fetch_and_add_4'
/home/krivenok/dev_builds/glibc-2.9_obj/libc_pic.os:/home/krivenok/dev_builds/g
libc-2.9/nscd/nscd-client.h:320: more undefined references to `__sync_fetch_and_add_4' follow
/home/krivenok/dev_builds/glibc-2.9_obj/libc_pic.os: In function `__nscd_get_map_ref':
/home/krivenok/dev_builds/glibc-2.9/nscd/nscd_helper.c:431: undefined reference to `__sync_val_compare_and_swap_4'
/home/krivenok/dev_builds/glibc-2.9_obj/libc_pic.os: In function `*__GI___libc_freeres':
/home/krivenok/dev_builds/glibc-2.9/malloc/set-freeres.c:39: undefined reference to `__sync_bool_compare_and_swap_4'
collect2: ld returned 1 exit status
make[1]: *** [/home/krivenok/dev_builds/glibc-2.9_obj/libc.so] Ошибка 1
make[1]: Leaving directory `/home/krivenok/dev_builds/glibc-2.9'
make: *** [all] Ошибка 2


Пойду гуглить дальше.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от mv

>Скачайте livecd 10-й Федоры, там glibc 2.9.

Скачал, загрузился.
gcc там нет.
Решил просто закинуть туда a.out и libACE.so и посмотреть 
что получится.

Результат тот же:

[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.27.5-117.fc10.i686 #1 SMP Tue Nov 18 12:19:59 EST 2008 i686 i686 i386 GNU/Linux
[root@localhost ~]# ls -l /lib/libc.so.6
lrwxrwxrwx 1 root root 11 2008-11-19 14:11 /lib/libc.so.6 -> libc-2.9.so
[root@localhost ~]# ldd ./a.out 
	linux-gate.so.1 =>  (0x00130000)
	libACE-5.6.8.so => ./libACE-5.6.8.so (0x00133000)
	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00293000)
	libm.so.6 => /lib/libm.so.6 (0x00383000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x003ac000)
	libpthread.so.0 => /lib/libpthread.so.0 (0x003ba000)
	libc.so.6 => /lib/libc.so.6 (0x003d4000)
	libdl.so.2 => /lib/libdl.so.2 (0x00548000)
	/lib/ld-linux.so.2 (0x00110000)
[root@localhost ~]# ./a.out 
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
[root@localhost ~]# ./a.out 123
UNIX time = 1238456466, Local time = 2009-3-30 19:41:6
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
After acquiring the semaphore. r = -1. Function not implemented
[root@localhost ~]# 

Сейчас у меня поставится glibc-2.9 на другой машине и там 
попробую собрать программу и запустить.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Хм... Ещё раз перепроверил, работает:

$ ./a.out 1
UNIX time = 1238432570, Local time = 2009-3-30 19:2:50
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C

mv ★★★★★
()
Ответ на: комментарий от mv

Собрал таки glibc-2.9 на Gentoo:

proxy strange # uname -a
Linux proxy.orangesystem.ru 2.6.29-gentoo #1 SMP Sat Mar 28 17:20:13 MSK 2009 i686 Intel(R) Celeron(R) CPU 2.53GHz GenuineIntel GNU/Linux
proxy strange # ls -l /lib/libc.so.6 
lrwxrwxrwx 1 root root 11 Mar 30 21:01 /lib/libc.so.6 -> libc-2.9.so
proxy strange #

У меня не работает:

proxy strange # ./a.out 
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
proxy strange # ./a.out  123
UNIX time = 1238432658, Local time = 2009-3-30 21:4:18
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
After acquiring the semaphore. r = -1. Function not implemented
proxy strange # 

Буду дальше думать в чем же трабла.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от mv

Похоже моя гипотеза относительно glibc > 2.6.1 терпит крах.

Собрал на моем домашнем серваке под Ubuntu (AMD 64):

krivenok@home 23:16:18 ~/strange $ uname -a
Linux home 2.6.27-11-server #1 SMP Thu Jan 29 20:13:12 UTC 2009 x86_64 GNU/Linux
krivenok@home 23:21:40 ~/strange $ ls -l /lib/libc.so.6 
lrwxrwxrwx 1 root root 14 Feb 11 10:28 /lib/libc.so.6 -> libc-2.8.90.so
krivenok@home 23:21:49 ~/strange $

мою тестовую программу и она работает:

krivenok@home 23:21:49 ~/strange $ LD_LIBRARY_PATH=/usr/local/dev/ace-5.6.8/lib/ ldd ./a.out
        linux-vdso.so.1 =>  (0x00007fff223fe000)
        libACE-5.6.8.so => /usr/local/dev/ace-5.6.8/lib/libACE-5.6.8.so (0x00007fa019d16000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fa019a09000)
        libm.so.6 => /lib/libm.so.6 (0x00007fa019784000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fa01956c000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00007fa019350000)
        libc.so.6 => /lib/libc.so.6 (0x00007fa018fde000)
        libdl.so.2 => /lib/libdl.so.2 (0x00007fa018dda000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa01a08d000)
krivenok@home 23:21:58 ~/strange $ LD_LIBRARY_PATH=/usr/local/dev/ace-5.6.8/lib/ ./a.out 123
UNIX time = 1238440924, Local time = 2009-3-30 23:22:4
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
krivenok@home 23:22:06 ~/strange $ LD_LIBRARY_PATH=/usr/local/dev/ace-5.6.8/lib/ ./a.out    
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
krivenok@home 23:22:11 ~/strange $ 

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Ну вообще странные вещи ближе к ночи начались.
Собрал на ноуте своем (Gentoo/AMD 64):

krivenok@mobile 23:32:13 ~/strange $ uname -a
Linux mobile 2.6.27-gentoo-r7 #13 SMP Fri Jan 23 23:22:10 MSK 2009 x86_64 AMD Turion(tm) 64 X2 Mobile Technology TL-60 AuthenticAMD GNU/Linux
krivenok@mobile 23:32:16 ~/strange $ ls -l /lib/libc.so.6 
lrwxrwxrwx 1 root root 11 Mar 12 00:53 /lib/libc.so.6 -> libc-2.8.so
krivenok@mobile 23:32:27 ~/strange $ 

ту же программу и она тоже работает:

krivenok@mobile 23:32:31 ~/strange $ LD_LIBRARY_PATH=/usr/local/dev/ace-5.6.7/lib/ ldd ./a.out    
	linux-vdso.so.1 =>  (0x00007fffa0bfe000)
	libACE-5.6.7.so => /usr/local/dev/ace-5.6.7/lib/libACE-5.6.7.so (0x00007fb398575000)
	libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/libstdc++.so.6 (0x00007fb398272000)
	libm.so.6 => /lib/libm.so.6 (0x00007fb397ff1000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fb397de3000)
	libpthread.so.0 => /lib/libpthread.so.0 (0x00007fb397bc8000)
	libc.so.6 => /lib/libc.so.6 (0x00007fb397880000)
	librt.so.1 => /lib/librt.so.1 (0x00007fb397677000)
	libdl.so.2 => /lib/libdl.so.2 (0x00007fb397473000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fb398938000)
krivenok@mobile 23:32:40 ~/strange $ LD_LIBRARY_PATH=/usr/local/dev/ace-5.6.7/lib/ ./a.out
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
krivenok@mobile 23:32:48 ~/strange $ LD_LIBRARY_PATH=/usr/local/dev/ace-5.6.7/lib/ ./a.out 123
UNIX time = 1238441571, Local time = 2009-3-30 23:32:51
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
krivenok@mobile 23:32:53 ~/strange $ 

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от mv

Перед ACE_Thread_Semaphore sem(0); добавь что-нибудь типа char tmp[256]; Если помогло, то рапортуй баг Ульриху.

mv ★★★★★
()
Ответ на: комментарий от mv

> Так в каком случае не работает? На 32-битной системе?
На всех 32-битных НЕ работает.
На обоих 64-битных работает.

А ты компилировал на 64-битной?

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

> А ты компилировал на 64-битной?

Да. У тебя, по ходу дела, семафор в памяти лежит сразу за временем, и localtime затирает нужный кусок.

mv ★★★★★
()
Ответ на: комментарий от mv

> Перед ACE_Thread_Semaphore sem(0); добавь что-нибудь типа char tmp[256]; Если помогло, то рапортуй баг Ульриху.

Нет, не помогло.
Вставлял и до, и после. Экспериментировал с размером.
Не помогает.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

> На всех 32-битных НЕ работает. На обоих 64-битных работает.

На 64-битном хосте 32-битный бинарник работает, кстати.

mv ★★★★★
()
Ответ на: комментарий от mv

> Да. У тебя, по ходу дела, семафор в памяти лежит сразу за временем, и localtime затирает нужный кусок.

По крайней мере есть четкая закономерность.

Начинает работать, если 
ACE_Thread_Semaphore sem(0);
поместить на первой строке функции main, то есть до 
выделения памяти под struct tm и вызова localtime_r.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Значит, так и есть: перетирает. Завтра, если время будет, посмотрю на 32-битной системе, где ошибка.

mv ★★★★★
()
Ответ на: комментарий от mv

> Адреса в памяти для sem и всего остального можешь вывести?

Это для первоначального варианта:

krivenok@develop2 00:12:20 /tmp/strange $ ./a.out 123
Address of tm_:0xbf9b59b4
UNIX time = 1238443943, Local time = 2009-3-31 0:12:23
Address of sem:0xbf9b59e4
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
After acquiring the semaphore. r = -1. Function not implemented
krivenok@develop2 00:12:23 /tmp/strange $ 

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от mv

> Значит, так и есть: перетирает. Завтра, если время будет, посмотрю на 32-битной системе, где ошибка.

Заранее спасибо!

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Очень вероятно, что localtime_r перезатирает память вне структуры tm_.
Если вместо localtime_r просто обнулить структуру так:

memset(&tm_, '\0', sizeof(tm_));

то все работает.
Вроде в таком занулении нет ничего криминального (если не использовать
структуру вдальнейшем).
А localtime_r не имеет права делать ничего, кроме как изменять эту структуру.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от mv

> На 10-й Федоре с glibc-2.9.2 работает. Попробую 9-ку...

Она 32-битная?

Я пробовал на LiveCD Fedora 10 с glibc-2.9.
Закинул туда бинарник и libACE.so.
При этом не работало.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Вот ссылка на архив:
http://rapidshare.com/files/215620642/strange.tar.bz2.html
Контент следующий:
strange/
strange/libACE-5.6.8.so
strange/a.out

Собирал так:

krivenok@develop2 10:27:32 /tmp/strange $ g++-4.3.2 -g -I /usr/local/dev/ace-5.6.8/include/ -L /usr/local/dev/ace-5.6.8/lib/ -pthread -lACE main.cpp
krivenok@develop2 10:27:41 /tmp/strange $ ./a.out
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
krivenok@develop2 10:27:44 /tmp/strange $ ./a.out 1
UNIX time = 1238480865, Local time = 2009-3-31 10:27:45
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
After acquiring the semaphore. r = -1. Function not implemented
krivenok@develop2 10:27:45 /tmp/strange $ ldd ./a.out
        linux-gate.so.1 =>  (0xb7f9a000)
        libACE-5.6.8.so => /usr/local/dev/ace-5.6.8/lib/libACE-5.6.8.so (0xb7e39000)
        libstdc++.so.6 => /usr/local/dev/gcc-4.3.2/lib/gcc/i686-pc-linux-gnu/4.3.2/libstdc++.so.6 (0xb7d4b000)
        libm.so.6 => /lib/libm.so.6 (0xb7d0d000)
        libgcc_s.so.1 => /usr/local/dev/gcc-4.3.2/lib/gcc/i686-pc-linux-gnu/4.3.2/libgcc_s.so.1 (0xb7cff000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb7ce7000)
        libc.so.6 => /lib/libc.so.6 (0xb7bac000)
        libdl.so.2 => /lib/libdl.so.2 (0xb7ba8000)
        /lib/ld-linux.so.2 (0xb7f9b000)
krivenok@develop2 10:27:50 /tmp/strange $

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от mv

> На 8-й Федоре с ядром 2.6.25, glibc 2.8 и gcc 4.3.0 НЕ работает :) Digging...

Не работает скомпилированная там же или мой бинарник?

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от mv

> Только твой бинарник. Собранный своим компилятором работает.

Я уже не улавливаю закономерности.

На самом деле ни на одной 32-битной системе у меня на Gentoo (а также 
у моего коллеги на Ubuntu) НЕ работает скомпилированная прога.

А у тебя под 32-бита скомпилированная работает, а моя нет.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

У меня на 32-битной Федоре ace 5.6.5, с ним работает. Если подсунуть 5.6.8, вылезает то же самое, что у тебя.

mv ★★★★★
()
Ответ на: комментарий от mv

> У меня на 32-битной Федоре ace 5.6.5, с ним работает. Если подсунуть 5.6.8, вылезает то же самое, что у тебя.

Я проводил тесты на 5.6.7 и 5.6.8.
Сейчас попробую с 5.6.5

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

У меня с ACE-5.6.5 не работает:


krivenok@develop2 12:41:09 /tmp/strange $ ldd ./a.out 
        linux-gate.so.1 =>  (0xb7f3d000)
        libACE-5.6.5.so => /usr/local/dev/ace-5.6.5/lib/libACE-5.6.5.so (0xb7de0000)
        libstdc++.so.6 => /usr/local/dev/gcc-4.3.2/lib/gcc/i686-pc-linux-gnu/4.3.2/libstdc++.so.6 (0xb7cf2000)
        libm.so.6 => /lib/libm.so.6 (0xb7cb4000)
        libgcc_s.so.1 => /usr/local/dev/gcc-4.3.2/lib/gcc/i686-pc-linux-gnu/4.3.2/libgcc_s.so.1 (0xb7ca6000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb7c8e000)
        libc.so.6 => /lib/libc.so.6 (0xb7b53000)
        libdl.so.2 => /lib/libdl.so.2 (0xb7b4f000)
        /lib/ld-linux.so.2 (0xb7f3e000)
krivenok@develop2 12:41:10 /tmp/strange $ ./a.out 
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
krivenok@develop2 12:41:13 /tmp/strange $ ./a.out 1
UNIX time = 1238488874, Local time = 2009-3-31 12:41:14
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
After acquiring the semaphore. r = -1. Function not implemented
krivenok@develop2 12:41:14 /tmp/strange $ 

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Я сейчас пытаюсь написать пример, который вообще от ACE не зависит.
Пока мне это не удается, но я почти на 100% уверен, что ACE здесь
не виноват ни в чем.

Так как эксперимент с добавлением 
char buf[256]
не привел к устранению проблемы, а перенос 
ACE_Thread_Semaphore sem(0)
в начало main() ее устранил, я полагаю, что перезатирается память
не под объект sem, а некоторая другая область памяти, используемая
при вызове sem_wait. 
Это, в свою очередь, приводит к передаче мусора в качестве параметра
futex (что видно в выводе strace).

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Что-то абсолютно точно загаживается, потому что даже *sem = new не помогает. Непонятно только, почему у меня с 5.6.5 ничего не гадится.

mv ★★★★★
()
Ответ на: комментарий от mv

> Что-то абсолютно точно загаживается, потому что даже *sem = new не помогает. Непонятно только, почему у меня с 5.6.5 ничего не гадится.

Аналогично.
Не работает при размещении семафора в heap'е.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от true_admin

> простите что спрашиваю, valgrind пробовали? -fmudflap(оно, правда, глючное)? :)

valgrind пробовал, правда на другом примере (еще не дошел тогда
до наименьшего примера, демонстрирующего проблему).
Единственное сообщение, которое он выдавал по поводу проблемы - что-то
типа "в вызвов futex передается параметр из непроинициализированной
области памяти".
Точное сообщение не помню, а сейчас нет доступа на хост с линуксом.

Завтра запущу и напишу что он точно выводит.
С опциями gcc тоже можно поиграться.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

Вот что говорит нам valgrind:

...
...
==5595== Conditional jump or move depends on uninitialised value(s)
==5595==    at 0x400AB31: (within /lib/ld-2.8.so)
==5595==    by 0x4003F36: (within /lib/ld-2.8.so)
==5595==    by 0x4014185: (within /lib/ld-2.8.so)
==5595==    by 0x400138E: (within /lib/ld-2.8.so)
==5595==    by 0x4000986: (within /lib/ld-2.8.so)
==5595== 
==5595== Conditional jump or move depends on uninitialised value(s)
==5595==    at 0x400AC74: (within /lib/ld-2.8.so)
==5595==    by 0x4003F36: (within /lib/ld-2.8.so)
==5595==    by 0x4014185: (within /lib/ld-2.8.so)
==5595==    by 0x400138E: (within /lib/ld-2.8.so)
==5595==    by 0x4000986: (within /lib/ld-2.8.so)
UNIX time = 1238562046, Local time = 2009-4-1 9:0:46
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
==5595== 
==5595== Syscall param futex(op) contains uninitialised byte(s)
==5595==    at 0x4000962: (within /lib/ld-2.8.so)
==5595==    by 0x8048E40: ACE_Semaphore::acquire() (Semaphore.inl:31)
==5595==    by 0x8048D6D: main (main.cpp:30)

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

На счет mudflap.
Очень интересная вещь.

Компилируем как обычно и запускаем:

krivenok@develop2 09:09:48 ~/strange $ g++-4.3.2 -g -I /usr/local/dev/ace-5.6.7/include/ -L /usr/local/dev/ace-5.6.7/lib/ -pthread -lACE main.cpp 
krivenok@develop2 09:10:00 ~/strange $ ./a.out 
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
krivenok@develop2 09:10:04 ~/strange $ ./a.out 1
UNIX time = 1238562605, Local time = 2009-4-1 9:10:5
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
After acquiring the semaphore. r = -1. Function not implemented
krivenok@develop2 09:10:05 ~/strange $ 

Получаем ошибку.

Теперь компилируем с -lmudflap и запускаем:

krivenok@develop2 09:10:08 ~/strange $ g++-4.3.2 -g -I /usr/local/dev/ace-5.6.7/include/ -L /usr/local/dev/ace-5.6.7/lib/ -pthread -lACE -lmudflap main.cpp 
krivenok@develop2 09:10:15 ~/strange $ ./a.out 
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
krivenok@develop2 09:10:19 ~/strange $ ./a.out 1
UNIX time = 1238562620, Local time = 2009-4-1 9:10:20
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
krivenok@develop2 09:10:22 ~/strange $ 

Все работает.

Не совсем понял почему, но работает и так:

krivenok@develop2 09:10:22 ~/strange $ MUDFLAP_OPTIONS='-mode-nop' ./a.out 1
UNIX time = 1238562768, Local time = 2009-4-1 9:12:48
Before acquiring the semaphore. We must hang here since current value of semaphore is 0.
^C
krivenok@develop2 09:12:49 ~/strange $

Хотя в доке сказано:
-mode-nop                mudflaps do nothing

Короче, если просто слинковаться вместе с libmudflap, то программа
начинает работать.
Но причина проблемы мной так и не обнаружена.

Krivenok_Dmitry
() автор топика
Ответ на: комментарий от Krivenok_Dmitry

> Короче, если просто слинковаться вместе с libmudflap, то программа начинает работать.

бывает и такое :(. К сожалению, ни о чём хорошем это не говорит.

Посмотри в gdb кто портит память. Там можно отслеживать кто читает и кто пишет по заданным адресам.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.