Поведение планирования потоков в Linux между этапами с GDB по сравнению с пошаговым выполнением с GDB - PullRequest
0 голосов
/ 29 ноября 2018

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

Myвопрос заключается в следующем: разумно ли предположить, что среднее поведение планирования ОС между этапами GDB сравнимо со средним поведением планирования ОС, когда нет перехода (при этом все еще используется GDB для поддержания как можно большего числа переменных постоянными), илиДостаточно ли степпинга с планированием, чтобы продвижение потоков (в среднем) не было таким же, как без пошагового выполнения?

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

1 Ответ

0 голосов
/ 30 ноября 2018

Разумно ли предположить, что среднее поведение планирования ОС между этапами GDB сравнимо со средним поведением планирования ОС, когда нет перехода

Не совсем.Среднее поведение «не наступая» приведет к тому, что потоки либо исчерпают свои временные кванты, либо заблокируют системные вызовы.В случае «пошагового» потока маловероятно, что у каждого из них закончатся кванты времени (поскольку временное расстояние между шагами, вероятно, будет очень коротким).Таким образом, среднее поведение, вероятно, будет сильно отличаться.

как я могу получить точное представление о потоке многопоточной программы и состоянии программы в отдельных точках моей программы?

Как правило, вам не нужно заботиться о многопоточной программе flow .Таким способом невозможно отладить многопоточные программы.

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

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