getaddrinfo и gethostbyname аварийно завершают работу при вызове из дочернего потока?

Мы создали многопоточное одноядерное приложение, работающее на Ubuntu.

Когда мы вызываем getaddrinfo и gethostbyname из основного процесса, он не падает.

Однако, когда мы создаем поток из основного процесса и функции getaddrinfo и gethostbyname вызываются из созданного потока, он всегда падает.

Пожалуйста, помогите. Пожалуйста, найдите стек вызовов ниже:

#0  0xf7e9f890 in ?? () from /lib/i386-linux-gnu/libc.so.6
#1  0xf7e9fa73 in __res_ninit () from /lib/i386-linux-gnu/libc.so.6
#2  0xf7ea0a68 in __res_maybe_init () from /lib/i386-linux-gnu/libc.so.6
#3  0xf7e663be in ?? () from /lib/i386-linux-gnu/libc.so.6
#4  0xf7e696bb in getaddrinfo () from /lib/i386-linux-gnu/libc.so.6
#5  0x080c4e35 in mn_task_entry (args=0xa6c4130 <ipc_os_input_params>) at /home/nextg/Alps_RT/mn/src/mn_main.c:699
#6  0xf7fa5d78 in start_thread () from /lib/i386-linux-gnu/libpthread.so.0
#7  0xf7e9001e in clone () from /lib/i386-linux-gnu/libc.so.6

person Syed Aslam    schedule 26.09.2014    source источник
comment
Вы не показали никакого кода. Время научиться использовать gdb.   -  person vanza    schedule 26.09.2014
comment
gethostbyname не требует повторного входа и поэтому, вероятно, не является потокобезопасным, если вызывается из нескольких потоков. Если вы используете glibc в качестве библиотеки c, вы можете попробовать использовать gethostbyname_r, чтобы посмотреть, решит ли это проблему.   -  person John Ledbetter    schedule 26.09.2014


Ответы (2)


Причина сбоя getaddrinfo в том, что у дочернего потока, выполняющего вызов, недостаточно места в стеке.

person Syed Aslam    schedule 01.10.2014

Использование классов библиотек ACE C++ версии 6.5.1, использующих ACE_Thread::spawn_n с ACE_DEFAULT_THREAD_PRIORITY (1024*1024) по умолчанию, приведет к сбою при вызове gethostbyname/getaddrinfo внутри дочернего элемента, как сообщает Сайед Аслам. Анализ схемы libxml2 занимает вечность, используя дочерний поток Segment Faulted после вызова xmlNanoHTTPConnectHost, поскольку он пытается разрешить schemaLocation.

ACE_Task активировать

const ACE_TCHAR *thr_name[1];
thr_name[0] = "Flerf";
// libxml2-2.9.7/nanohttp.c:1133
// gethostbyname will crash when child thread making the call 
// has insufficient stack space.
size_t stack_sizes[1] = {
  ACE_DEFAULT_THREAD_STACKSIZE * 100
};

const INT ret = this->activate (
  THR_NEW_LWP/*Light Weight Process*/ | THR_JOINABLE,
  1,
  0/*force_active*/,
  ACE_DEFAULT_THREAD_PRIORITY,
  -1/*grp_id*/,
  NULL/*task*/,
  NULL/*thread_handles[]*/,
  NULL/*stack[]*/,
  stack_sizes/*stack_size[]*/,
  NULL/*thread_ids[]*/,
  thr_name
);
person Ako    schedule 10.04.2019