static File findPdb(Analyzer pdbAnalyzer, Program program, boolean allowRemote,
			TaskMonitor monitor) {

		SymbolFileInfo symbolFileInfo = SymbolFileInfo.fromProgramInfo(program);
		if (symbolFileInfo == null) {
			Msg.info(pdbAnalyzer,
				"Skipping PDB processing: missing PDB information in program metadata");
			return null;
		}

		// First look in the program's analysis options to see if there is a
		// manually specified pdbFile. (see setPdbFileOption)
		// If not set, then do a search using the currently configured symbol servers.
		Options options = program.getOptions(Program.ANALYSIS_PROPERTIES);
		String pdbFileOptionName = pdbAnalyzer.getName() + "." + OPTION_NAME_PDB_FILE;

		// check existence first to avoid creating option value
		File pdbFile = options.contains(pdbFileOptionName)
				? options.getFile(pdbFileOptionName, null)
				: null;
		if (pdbFile == null) {
			Set<FindOption> findOpts = allowRemote
					? FindOption.of(FindOption.ALLOW_UNTRUSTED)
					: FindOption.NO_OPTIONS;
			pdbFile = PdbPlugin.findPdb(program, findOpts, monitor);
		}
		if (pdbFile == null) {
			Msg.info(pdbAnalyzer,
				"Skipping PDB processing: failed to locate PDB file in configured locations");
			if (SystemUtilities.isInHeadlessMode()) {
				Msg.info(pdbAnalyzer,
					"Use a script to set the PDB file location. I.e.,\n" +
					"    PdbAnalyzer.setPdbFileOption(currentProgram, new File(\"/path/to/pdb/file.pdb\")); or\n" +
					"    PdbUniversalAnalyzer.setPdbFileOption(currentProgram, new File(\"/path/to/pdb/file.pdb\"));\n" +
					"Or set the symbol server search configuration using:" +
					"    PdbPlugin.saveSymbolServerServiceConfig(...);\n" +
					" This must be done using a pre-script (prior to analysis).");
			}
			else {
				Msg.info(pdbAnalyzer,
					"You may set the PDB \"Symbol Server Config\"" +
					"\n using \"Edit->Symbol Server Config\" prior to analysis." +
					"\nIt is important that a PDB is used during initial analysis " +
					"\nif available.");
			}
		}
		else {
			Msg.info(pdbAnalyzer, "PDB analyzer parsing file: " + pdbFile);
			if (!pdbFile.isFile()) {
				Msg.error(pdbAnalyzer,
					"Skipping PDB processing: specified file does not exist or is not readable: " +
						pdbFile);
				return null;
			}

		}
		return pdbFile;
	}
Common pdb searching logic between both analyzers.

@param pdbAnalyzer the analyzer doing the searching
@param program the program
@param allowRemote boolean flag, true means searching remote symbol servers
 is allowed 
@param monitor {@link TaskMonitor} to let user cancel
@return File pointing to the found pdb, or null if not found or error
Ghidra/Features/PDB/src/main/java/ghidra/app/plugin/core/analysis/PdbAnalyzerCommon.java