2014-10-21 3 views
1

Мой проект довольно большой и многопоточный. Должна быть ошибка, которая приводит к сбою всей программы.Как отслеживать код ошибки из этой информации

Для версии выпуска он иногда застревает, но не появляется очень часто. Для кода отладки, скорее всего, появится. И трассировка стека gdb следующая.

0 clone() at ../sysdeps/unix/sysv/linux/x86_64/clone.S:81 
1 0x00007dff8270c700 in ??() 
2 0x00007ffff6dde38d in clone() at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111 

Эта информация недостаточно для того, чтобы найти код ошибки.

Так что мой вопрос: как получить дополнительную информацию от аварии? любое расширенное использование gdb или других продвинутых инструментов?

============= Update ==============

Один больше информации, чтобы добавить, после распечатки всех потоков иды, Я выясняю поток, который разбился. Единственная разница в потоке заключается в том, что он отсоединен от объекта std-потока. Если у кого-нибудь есть опыт с этим, пожалуйста, скажите мне.

============= Update2 ================

Эта проблема еще не решена, и оказываются один. Если я запустил терминал, он разрушит весь терминал и все другие программы, запущенные в настоящее время под моим именем пользователя. Система затем недоступна и недоступна ssh. Есть некоторые другие пользователи, получающие сломанную трубу, и кажется, что моя программа сделала sshd не отзывчивым.

Через некоторое время я могу снова войти в систему и найти, что бинарный файл программы сломан (усечен) и необходимо перекомпилировать.

+1

Вы видели https://sourceware.org/gdb/onlinedocs/gdb/Threads.html? – user657267

+2

Единственный ответ, о котором я могу думать на основе этой информации, это то, что вы не можете запрограммировать случайным образом угадывая синтаксис и смысл. Вместо этого вы должны активно понимать, что делает каждая часть вашей программы и как она взаимодействует с другими частями. Похоже, что это не так, как ваш проект развился. (Я понимаю, что сейчас это мало помогает, но ни диагностика, которую вы представили, ни хороший диагноз для вашего следующего проекта.) –

+0

@ user657267 Я переключался между потоками, ошибка из одного из потоков, но я не знаю Не знаю, какой поток он есть, и у backtrace есть только вышеуказанная информация. –

ответ

2

Для меня это выглядит как перезапись памяти или стек или доступ к мертвым указателям или объектам.

Чтобы поймать подобные ошибки, я хотел бы использовать такие инструменты, как efence или valgrind. С помощью реальных компиляторов вы также можете использовать thread sanitizer или memory sanitizer. Оба работают с clang и g ++.

Если вы не можете уловить проблему, вам также следует установить версию библиотеки debug стандартных библиотек. Иногда неправильное значение вылетает внутри g ++ lib или некоторых других библиотек, что приводит к сложным для отладки ситуациям. С установленными настройками debug вы можете поймать это намного проще.

Смежные вопросы