2009-11-17 5 views
3

Я использую библиотеку C++, которая предназначена для многопоточной обработки, и число рабочих потоков может быть установлено с использованием переменной. В библиотеке используются pthreads. Проблема возникает, когда я запускаю приложение, которое предоставляется как тест библиотеки, на четырехъядерном компьютере, используя 3 потока или больше. Приложение завершает работу с ошибкой времени сбоя сегментации. Когда я пытаюсь вставить некоторые трассировки «cout» в некоторых частях библиотеки, проблема решена, и приложение заканчивается нормально. При работе на одноядерной машине, независимо от того, какое количество потоков используется, приложение заканчивается нормально.Ошибка сегментации только при работе на многоядерном

Как я могу определить, где проблема?

Это какая-то ошибка синхронизации? как я могу его найти? есть ли какой-нибудь инструмент, который я могу использовать, тоже проверить код?

+4

Из вашего описания, похоже, гоночное состояние, где один из потоков, скорее всего, пытается получить доступ к памяти, которая еще не инициализирована другим потоком. Возможно, вы захотите воспроизвести его под отладчиком и посмотреть на стек вызовов в точке отказа. –

+0

Я действительно не знаю, где точка отказа, потому что в режиме отладки проблема не появляется. – Navid

+0

Некоторые компиляторы в режиме отладки инициализируют переменные по их значениям по умолчанию, поэтому это может не произойти в режиме отладки –

ответ

0

Некоторые общие рекомендации по отладке.

  1. Убедитесь, что у вашей сборки есть символы (скомпилируйте с -g). Эта опция ортогональна другим вариантам сборки (т. Е. Решение строить с символами не зависит от уровня оптимизации).
  2. Как только у вас есть символы, внимательно посмотрите на стек вызовов, где произошла ошибка seg. Для этого сначала убедитесь, что ваша среда настроена на создание файлов ядра (ulimit -c unlimited), а затем после сбоя загрузите программу/ядро ​​в отладчик (gdb/path/to/prog/path/to/core) , Как только вы узнаете, какая часть вашего кода вызывает крах, это должно дать вам лучшее представление о том, что происходит не так.
+0

Я ничего не знаю о том, что такое ядро. и я не знаю/path/to/core. не могли бы вы объяснить более подробно, пожалуйста? – Navid

+0

Ну, скоро вы обнаружите «gdb» :) –

2

Похоже, вы используете Linux (вы упоминаете pthreads). Рассматривали ли вы запуск valgrind?

У Valgrind есть инструменты для проверки условий гонки данных (helgrind) и проблем с памятью (memcheck). Valgrind может найти такую ​​ошибку в режиме отладки без необходимости создания сбоя, который создает режим выпуска.

+0

Я использовал helgrind. он предлагает некоторые ошибки в качестве условий гонки в секциях, которые запускаются в последовательных разделах кода , а также указывает на некоторые идентичные ошибки в параллельных частях, как показано ниже, но я не понимаю, что это значит. -------------------------------------------- == 28556 == Это противоречит предыдущему чтению размера 4 по потоку # 6 == 28556 == at 0x806A3ED: Население :: GaSortedGroup :: GetAt (int) const (SortedGroup.h: 181) ..... (заказ вызовов метода) – Navid

+0

Условие гонки - это то, где у вас есть два или более потока, которые ищут один и тот же бит данных (потенциально) в одно и то же время. Обычно общие измененные данные должны быть защищены мьютексом, поэтому вы не можете (например) получить один поток данных чтения, поскольку другой поток обновляет его. Это может привести к устаревшим данным и привести к проблемам. –

0

Вы работаете в состоянии гонки.
Где несколько потоков взаимодействуют на одном ресурсе.
Существует целый ряд возможных преступников, но без источника ничего, что мы говорим, является догадкой.

Вы хотите создать файл ядра; затем отлаживайте приложение с помощью основного файла. Это настроит отладчик на состояние приложения в момент его разбивки. Это позволит вам изучить переменные/регистры и т. Д.

Как это сделать, в зависимости от вашей системы.

Быстрый Google открыл это:

http://www.codeguru.com/forum/archive/index.php/t-299035.html

Надеется, что это помогает.

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