No, I don't think that's how it works.
If you attach to a running program, that simply tells the debugger which process to be interested in, and from this it can find the EXE file and the PDB symbols file. From the PDB symbols the debugger can find the required source code files and the line numbers matching the binary code.
When you put a breakpoint in the source code, the debugger checks the symbol table and finds out where that corresponds to in the binary. It then places a breakpoint in the binary of the running program at that location. Last time I looked at an Intel processor that involved replacing an instruction in the binary in memory by a different single byte instruction (RST 3) reserved for that purpose. On other processors the mechanism will be different.
When execution hits that special instruction, it causes a trap back into the debugger. The debugger restores the correct instruction (in case you happen to look at the disassembly) and looks up the breakpoint in its tables, finds the right source code and displays it for you to see.
It also finds the correct stack frame and shows you any local variables in that function.
When it all works correctly it's kind of magic but under the covers it's surprisingly simple.
Incidentally, it all works without a PDB file or source code file too, but then you only have the debugger's disassembly to work with.