@Override
	public boolean added(Program program, AddressSetView set, TaskMonitor monitor, MessageLog log) {

		// Only run once per transaction - avoid message duplication
		long txId = program.getCurrentTransactionInfo().getID();
		if (txId == lastTransactionId) {
			return false;
		}
		lastTransactionId = txId;

		// Only run if restricted set corresponds to entire program
		if (!set.contains(program.getMemory())) {
			return false;
		}

		if (PdbParser.isAlreadyLoaded(program)) {
			if (!PdbUniversalAnalyzer.isEnabled(program)) { // yield to other analyzer complaining
				Msg.info(this, "Skipping PDB analysis since it has previously run.");
				Msg.info(this, ">> Clear 'PDB Loaded' program property or use Load PDB action if " +
					"additional PDB processing required.");
			}
			return true;
		}

		if (PdbUniversalAnalyzer.isEnabled(program)) {
			log.appendMsg(getName(),
				"Stopped: Cannot run with " + PdbUniversalAnalyzer.NAME + " Analyzer enabled");
			return false;
		}

		File pdbFile = PdbAnalyzerCommon.findPdb(this, program, searchUntrustedLocations, monitor);
		if (pdbFile == null) {
			// Warnings have already been logged, but nice to have a post-analysis pop-up that
			// PDB analysis was not done
			log.appendMsg(NAME, "Warning: Could not find an appropriate PDB file; see log");
			return false;
		}

		AutoAnalysisManager mgr = AutoAnalysisManager.getAnalysisManager(program);
		return parsePdb(pdbFile, program, mgr, monitor, log);
	}
Finds and applies PDB debug information to the given Windows executable.
Ghidra/Features/PDB/src/main/java/ghidra/app/plugin/core/analysis/PdbAnalyzer.java