Ошибка сегментации только при работе на многоядерных - PullRequest
3 голосов
/ 17 ноября 2009

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

Как определить, откуда возникла проблема?

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

Ответы [ 3 ]

2 голосов
/ 17 ноября 2009

Звучит так, как будто вы используете Linux (вы упомянули pthreads). Рассматривали ли вы запуск valgrind ?

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

0 голосов
/ 17 ноября 2009

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

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

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

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

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

Надеюсь, это поможет.

0 голосов
/ 17 ноября 2009

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

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