In terms of the debugger architecture, a program node:
Is a lightweight description of a program.
Can identify itself and the process it is running in, and can be attached to, be detached from, and describe the debug engine (DE) that created it, if any.
Is represented by an IDebugProgramNode2 interface, typically created by a DE or port. Program nodes are added to a port by calling IDebugPortNotify2::AddProgramNode. When a program node is added to a port, it is added to the process containing the program that this program node represents.
Sometime after a debug session is started, depending on the implementation of the debug package, program nodes are used to create corresponding programs. When a process is queried for its programs, the programs are enumerated, one for each program node.
Before a program is attached to, the IDE needs only a lightweight description of the program. This information can be obtained from the program node. Once the program is attached to, the IDE needs to display more detailed information, such as a list of all threads running in the program. This information is obtained from the program itself.