Лучшая многопоточная отладка в Delphi - PullRequest
4 голосов
/ 05 февраля 2009

Исходя из ответа на другой вопрос об ошибках в Delphi IDE, кто-нибудь знает, есть ли способ улучшить функциональность многопоточной отладки в IDE, или если нет, по крайней мере, почему это так плохо на случай

Если в программе несколько потоков, выполнение кода с помощью F7 или F8 может часто приводить к очень длинным паузам, или вся IDE просто блокируется. Это особенно очевидно, когда вы покидаете или вводите метод или процедуру. Отладчик всегда подходит для однопоточных приложений.

PS. Я использую версию 2007

Ответы [ 5 ]

3 голосов
/ 05 февраля 2009

По моему опыту, многопоточная отладка гораздо лучше в Vista и Delphi 2009, чем в XP с Delphi 2007.

Во-первых, ide значительно стабильнее.

Во-вторых, в Delphi 2009 на Vista отладчик может показать вам, где возникают тупики.

Если вам нужно использовать Delphi 2007, я настоятельно рекомендую отлаживать ваш код в однопоточном модульном тесте, если это возможно, а затем использовать уже проверенный код в основной программе. ;)

2 голосов
/ 05 февраля 2009

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

Бывают случаи, когда невозможно интерактивно отладить приложение, которое само блокируется. Когда это происходит, вы можете использовать такие инструменты, как WinDbg и Adplus, для работы с дампами памяти. Да, это намного сложнее, чем использование интерактивного отладчика, но это лучше, чем отсутствие отладчика вообще. В блоге Тесс Феррандез есть примеры приложений, демонстрации и инструкции. Я бы начал с этой страницы . Лаборатории ориентированы на .NET, но не позволяйте этому держаться подальше; идеи совпадают.

1 голос
/ 06 февраля 2009

Когда я хочу отладить многопоточную операцию, я часто использую файл журнала (который я анализирую после запуска приложения) вместо интерактивного отладчика.

Например, с помощью функции «OutputDebugString». Вывод поступает в журнал событий Delphi. Если вы запускаете свою программу за пределами Delphi, вы можете использовать DebugView из SysInternals для отображения журнала. Позаботьтесь о том, чтобы добавить идентификатор потока к каждому выходу (GetCurrentThreadID). Имейте в виду, что перед записью в журнал может произойти переключение потоков. Но в местах, где взаимодействуют несколько потоков, у вас, вероятно, будет критический сеанс (или другой объект синхронизации), так что это должно стать проблемой.

0 голосов
/ 06 февраля 2009

Еще одна идея, которую я никогда не пробовал, потому что я просто подумал об этом: если вы заинтересованы в отладке одного потока и просто хотите, чтобы другие потоки его не беспокоили, возможно, можно временно приостановить некоторые потоки. 1001 *

Process Explorer от SysInternals предлагает возможность приостановить и возобновить потоки (на вкладке «Потоки» в свойствах процесса). Но, как я сказал, я никогда не проверял это до сих пор.

0 голосов
/ 05 февраля 2009

Да, отладка многопоточного приложения - сложная задача. Потому что ты постоянно меняешься с одного потока на другой.

...