Ошибка не возникает при использовании GDB.Как отлаживать? - PullRequest
0 голосов
/ 20 мая 2019

Проект c содержит ошибку, которая не возникает при подключении процесса к отладчику gnu (GDB).

Проект был написан студентами и не очень хорошо.Это проблема синхронизации потоков с использованием мьютекса и условных переменных.

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

ATM Я не пытаюсь отладить саму программу, но чтобы понять, почему и как GDB подавляет ошибку, дляв образовательных целях, чтобы затем иметь возможность правильно отлаживать программу.

GNU Debugger version: (openSUSE Leap 15.0) 8.2

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

Я рад изменить вопрос о запросах, но это лучшее, что я могу сделать в банкомате.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Я не пытаюсь отлаживать саму программу, но понимаю, почему и как GDB устраняет ошибку в образовательных целях, чтобы затем иметь возможность правильно отлаживать программу.

GDB устанавливает точки останова для процедур создания и выхода из потоков, поэтому он знает, как присоединять новые потоки и отсоединять мертвые.

Это влияет на синхронизацию многопоточных программ, особенно тех, которые создают или уничтожают много потоков.

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

0 голосов
/ 20 мая 2019

Ошибка не возникает при использовании GDB.Как отлаживать?

Используйте printf (или аналогичный) для записи отладочных сообщений:

  • printf перед блокировкой мьютекса
  • printf после блокировки мьютекса
  • printf при освобождении мьютекса

Если вы также распечатаете идентификаторы потока, вы сможете обнаружить, если поток забудет принять или освободить мьютекс.

...