Как узнать, кто создает все ваши потоки в программе delphi?

Если у вас есть чистый набор кода Delphi, и все потоки созданы с использованием TThread, вы можете установить точку останова в методе (ах) конструктора (TThread.Create) и узнать, кто создал ваши потоки. Вы даже можете попытаться назвать все свои потоки, используя функцию, встроенную в объект Delphi TThread, которая позволяет вам устанавливать отладочное имя для каждого потока.

Но как определить постоянные, труднодоступные дополнительные потоки, которые все еще анонимны (без имени отладки) и появляются, скажем, во время инициализации модуля при запуске приложения. Я могу выполнить пошаговую инициализацию модуля, но я не могу определить все исходные модули (из, скажем, более 900 выполненных разделов инициализации модулей), которые могут создавать потоки, и я не нашел способа добавить отладочное сообщение (используя свойства и сообщения точки останова), которое сбрасывало бы имя каждого модуля во время его инициализации. Творческое использование точек останова, установленных в System.pas, с сообщениями журнала позволяет мне делать некоторые вещи при отладке тривиально простых приложений, но чем сложнее становится мое приложение, тем больше я чувствую, что потоки, созданные в середине, ослеплены. приложения, и те, которые созданы во время инициализации модуля (то есть до того, как вы перейдете к первой строке кода в вашем проекте dpr).

Я хотел бы знать, какие передовые методы вы, возможно, нашли для идентификации и выяснить, кто создал конкретную тему. Если бы мы использовали отладчик, такой как GDB, вместо отладчика, такого как ядро ​​отладчика delphi (Turbo Debugger?), Которое встроено в IDE delphi, Я думаю, что мы могли бы установить точку останова для функции API Windows, такой как сам BeginThread. Но я не думаю, что смогу сделать это в Delphi.

Обновление: я не знал, что вы можете установить точку останова в разделе реализации windows.pas для внешних dll Windows, таких как kernel32.dll.

Обновление 2 : Кажется, что ответ Дэвида Х - лучшая идея для общего использования. Я также изучаю небольшую библиотеку вспомогательного кода, которую я пишу прямо сейчас, которая поддерживает словарь идентификаторов потоков, которые были замечены ранее, и которая присваивает некоторые имена отладки безымянным потокам в зависимости от времени их создания (какая функция мы звонили прямо перед тем, как заметили, что существует новый поток). Я думаю, что это поможет мне сузить мои 40+ пронумерованных потоков, чтобы все они получили имена, даже если некоторые из них созданы во внешних dll C / C ++, или процессами COM.

7
задан Warren P 31 January 2011 в 22:46
поделиться