Если вы можете связаться с любым из первоначальных разработчиков кода, поговорить с ними (по голосу или по электронной почте) и попросить их описать, как они должны работать, всегда лучше, чем пытаться перепроектировать их.намерение, глядя на код.Если вы не можете связаться с разработчиками напрямую, то, возможно, существует форум разработчика библиотеки или другой онлайн-ресурс, где вы можете обсудить структуру библиотеки с людьми, которые имеют опыт ее использования / отладки.
Еслиэто не вариант (или если вы сделали это и все еще не чувствуете, что понимаете что-то достаточно хорошо), то я часто нахожу это профилирование (либо с помощью инструмента профилирования, либо просто путем временного ввода printf()
[или подобного] отслеживание вызовов в кодовой базе в разных местах и просмотр того, что печатается, когда) - это хороший способ узнать, какие части кода фактически используются на каких этапах выполнения программы.Это поможет вам подтвердить (или опровергнуть) ваши теории о том, как работает кодовая база.Знание, где и когда создается каждый поток, где находится его функция входа и где / когда он снова соединяется с родительским потоком, особенно полезно.
Наконец, начните смотреть на различные фрагменты данных (например,объекты и переменные-члены) каждый поток проверяет и / или изменяет, и как синхронизируется / сериализуется доступ к каждому из этих фрагментов данных.Предполагая, что код не содержит ошибок, критические разделы базы кода являются хорошими индикаторами того, где происходит межпотоковая связь.