Сбой 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
1 ответ
Причина сбоя getaddrinfo в том, что дочернему потоку, выполняющему вызов, не хватило места в стеке.
Использование классов библиотек ACE C++ версии 6.5.1, которые используют ACE_Thread::spawn_n
по умолчанию ACE_DEFAULT_THREAD_PRIORITY (1024*1024)
вылетит при звонке gethostbyname/getaddrinfo
внутри ребенка, как сообщил Сайед Аслам. Разбор схемы libxml2 выполняется вечно, с использованием дочернего потока Сегмент Failed после вызова 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
);