Si tiene un conjunto limpio de código Delphi, y todos los subprocesos se crean con TThread, puede establecer un punto de interrupción en los métodos del constructor (TThread.Create) y descubrir quién creó sus subprocesos. Incluso podría tratar de nombrar todos sus hilos utilizando la característica integrada en el objeto Delphi TThread que le permite establecer un nombre de depuración para cada hilo.¿Cómo puede averiguar quién crea todos sus hilos en un programa delphi?
Pero, ¿cómo identifica los subprocesos persistentes y difíciles de encontrar, que siguen siendo anónimos (sin nombre de depuración) y que aparecen, por ejemplo, durante la inicialización del módulo, cuando se inicia la aplicación. Puedo pasar un solo paso a través de la inicialización del módulo, pero no puedo determinar todos los módulos fuente (de, digamos, más de 900 secciones de inicialización del módulo que están hechos) que pueden crear hilos, y no he encontrado una manera de agregue un mensaje de depuración (usando propiedades y mensajes de punto de interrupción) que volcará el nombre de cada unidad mientras se inicializa. El uso creativo de los puntos de interrupción establecidos en System.pas, con mensajes de registro me permite hacer algunas cosas al depurar aplicaciones trivialmente simples, pero cuanto más compleja es la aplicación, más me siento ciego por los hilos, tanto los creados durante el medio de una aplicación se ejecuta, y las creadas en el módulo-init time (eso es antes de que ingrese en la primera línea del código en su proyecto dpr).
Me gustaría saber qué técnicas avanzadas podrías haber encontrado para identificar y descubrir quién creó un hilo en particular. Si utilizáramos un depurador como GDB en lugar de un depurador como el delphi debugger kernel (Turbo Debugger?) Que está integrado en el delphi IDE, creo que podríamos establecer un punto de interrupción en una API de Windows como BeginThread. Pero no creo que pueda hacer eso en Delphi.
Actualización: No sabía que podía establecer un punto de interrupción en la sección de implementación de windows.pas para windows dlls externos como kernel32.dll.
Actualización 2: Parece que la respuesta de David H es la mejor idea para el uso general. También estoy buscando en una pequeña biblioteca de código auxiliar que estoy escribiendo ahora que mantiene un diccionario de identificadores de subprocesos que se han visto antes, y que asigna algunos nombres de depuración a subprocesos sin nombre, en función de su tiempo de creación (qué función estábamos llamando justo antes de notar que el nuevo hilo existe). Creo que esto me ayudará a restringir mis más de 40 hilos numerados para que todos sean nombrados, aunque algunos de ellos se creen en dlls C/C++ externos o mediante procesos COM.
Para información, kernel32 no es parte del kernel. Sé que esto es confuso. El kernel de Windows reside en ntoskrnl.exe. kernel32 es una DLL en modo de usuario, aunque estoy seguro de que pasa el trabajo al modo kernel para muchas de sus funciones. Ciertamente no se puede depurar el código del modo kernel con el depurador Delphi –
. Lo sabía realmente en algún lugar en la parte posterior de mi cabeza. Pero para ser menos descuidado he corregido mi actualización. –
Noto que un subproceso se crea mediante una llamada COM CoInitializeSecurity. Estaba un poco sorprendido por eso. –