public static boolean doAnalysis(Program program, File pdbFile,
			PdbReaderOptions pdbReaderOptions, PdbApplicatorOptions pdbApplicatorOptions,
			MessageLog log, TaskMonitor monitor) throws CancelledException {
		PdbLog.message(
			"================================================================================");
		PdbLog.message(new Date(System.currentTimeMillis()).toString() + "\n");
		PdbLog.message("Ghidra Version: " + Application.getApplicationVersion());
		PdbLog.message(NAME);
		PdbLog.message(DESCRIPTION);
		PdbLog.message("PDB Filename: " + pdbFile + "\n");

		try (AbstractPdb pdb = PdbParser.parse(pdbFile, pdbReaderOptions, monitor)) {
			monitor.setMessage("PDB: Parsing " + pdbFile + "...");
			pdb.deserialize();

			DefaultPdbApplicator applicator =
				new DefaultPdbApplicator(pdb, program, program.getDataTypeManager(),
					program.getImageBase(), pdbApplicatorOptions, monitor, log);
			applicator.applyDataTypesAndMainSymbolsAnalysis();

			AutoAnalysisManager aam = AutoAnalysisManager.getAnalysisManager(program);

			// TODO: Consider the various types of work we might want to do... they probably
			//  shouldn't all be the same priority.
			//   * function nested scopes, local/scope variables, static locals (might be in
			//     scopes).  Includes register/stack scopes of local/scoped variables
			//   * parameters
			//   * code source module/file/line numbers

			Msg.info(PdbUniversalAnalyzer.class,
				NAME + ": scheduling PDB Function Internals Analysis");
			// TODO: set this to appropriate priority (this is a guess for locals/params/scopes)
			// Initial thought on priority:  AnalysisPriority.FUNCTION_ANALYSIS.priority()
			// From meeting:
			//  * before/after parameter ID
			//  different statement:
			//  * run before stack reference analysis runs (maybe turn it that one off)
			// 902  Decompiler Parameter ID (DecompilerFunctionAnalyzer)
			// 903  Stack (StackVariableAnalyzer)
			aam.schedule(
				new ProcessPdbFunctionInternalsCommand(pdbFile, pdbReaderOptions,
					pdbApplicatorOptions, log),
				AnalysisPriority.DATA_TYPE_PROPOGATION.after().after().after().priority());

			// Following is intended to be the last PDB analysis background command
			aam.schedule(new PdbReportingBackgroundCommand(),
				AnalysisPriority.DATA_TYPE_PROPOGATION.after().after().after().after().priority());

		}
		catch (PdbException | IOException e) {
			log.appendMsg(NAME, "Issue processing PDB file:  " + pdbFile + ":\n   " + e.toString());
			return false;
		}

		return true;
	}
Initializes and calls the methods of the PdbApplicator pertaining to the various phases
 of PDB analysis.  These methods can be called via scheduled background commands set with
 the appropriate analysis priorities to allow the work to be done at the appropriate time
 amongst other analyzers.  The return PDB
@param program the program to which the PDB is being applied
@param pdbFile the PDB file to be applied
@param pdbReaderOptions the PDB "reader" options to use
@param pdbApplicatorOptions the PDB "applicator" options to use
@param log the message log to which messages will be written
@param monitor the task monitor
@return {@code true} if the first phase of analysis has completed without error.  Follow-on
 background commands will also have return values, which will include a {@code false} value
 upon user cancellation during those phases.
@throws CancelledException upon user cancellation
Ghidra/Features/PDB/src/main/java/ghidra/app/plugin/core/analysis/PdbUniversalAnalyzer.java