Ошибка сегментации в потоках повышения tls_destructor - PullRequest
4 голосов
/ 04 января 2010

Я написал небольшое приложение, используя пример Boost asio (3) многопоточного HTTP-сервера. Периодически я получаю ошибку сегмента, которая возникает, если я нажимаю ctrl-c приложением. Я знаю, что где-то перезаписываю память, но не совсем уверен, как ее отладить. Трассировка стека в GDB не помогает. Есть ли в GCC какие-то инструменты, которые могут помочь мне обнаружить коррупцию до того, как я ее ударил в dtor? (извините, я в основном парень с Java)

Спасибо. Использование Boost 1.38 в Debian Linux

PS Вот трассировка стека


Program terminated with signal 11, Segmentation fault.
#0  0xb7f74389 in tls_destructor (data=0xb5200fc8) at libs/thread/src/pthread/thread.cpp:86
86                                      thread_info->tss_data=current_node->next;
(gdb) where
#0  0xb7f74389 in tls_destructor (data=0xb5200fc8) at libs/thread/src/pthread/thread.cpp:86
#1  0xb7f75351 in thread_proxy (param=0xb5200fc8) at libs/thread/src/pthread/thread.cpp:142
#2  0xb7c03240 in start_thread () from /lib/tls/i686/cmov/libpthread.so.0
#3  0xb7dc049e in clone () from /lib/tls/i686/cmov/libc.so.6
(gdb)

1 Ответ

1 голос
/ 09 января 2010

Поскольку это многопоточная программа, есть вероятность, что в Boost-обновлении была только настоящая ошибка. Я бы предложил провести тестовый прогон с использованием инструментов Valgrind Memcheck и Helgrind в указанном порядке. Первый проверяет наличие проблем с управлением памятью, второй - условия гонки. ИМХО действительно незаменимый инструмент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...