NationalSecurityAgency/ghidra · error · IOException

At file '{pdbName}': {errorMessage}

Error message

At file '{pdbName}':
{errorMessage}

What it means

Thrown by CreatePdbXmlFilesScript.runPdbExe after invoking the external 'pdb.exe' helper. The script reads pdb.exe's stderr into a StringBuilder; if that buffer is non-empty, the partially-created .pdb.xml file is deleted and an IOException wrapping the stderr is thrown. It indicates the PDB parser emitted a diagnostic - typically a malformed, corrupt, or unsupported PDB.

Source

Thrown at Ghidra/Features/Base/ghidra_scripts/CreatePdbXmlFilesScript.java:150

			new BufferedReader(new InputStreamReader(currentProcess.getErrorStream()));
		String line = null;

		while ((line = reader.readLine()) != null) {
			strBuilder.append(line);
			strBuilder.append(System.getProperty("line.separator"));
		}

		reader.close();

		int exitValue = currentProcess.waitFor();
		String errorMessage = strBuilder.toString();

		if (errorMessage.length() > 0) {
			if (createdFile.isFile()) {
				createdFile.delete();
			}

			throw new IOException("At file '" + pdbName + "':\n" + errorMessage);
		}

		if (exitValue != 0) {
			if (createdFile.isFile()) {
				createdFile.delete();
			}

			throw new IOException(
				"At file '" + pdbName + "':\nAbnormal termination of 'pdb.exe' process.");
		}
	}

	private void getPDBFiles(File parentDir, List<File> foundFiles) {

		for (File childFile : parentDir.listFiles()) {
			if (childFile.isDirectory()) {
				getPDBFiles(childFile, foundFiles);
			}

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Re-download or regenerate the offending .pdb (the message names it).
  2. Check that the .pdb is not locked by another process (debugger, AV) on Windows.
  3. Verify the PDB format matches the pdb.exe version shipped with your Ghidra build.
  4. Run pdb.exe manually on the file to see the full stderr and diagnose the parse error.

Example fix

// before
runPdbExe(pdbExeLocation, pdbParentDir, pdbName, currentFilePath);

// after - run pdb.exe manually to inspect stderr, then retry with a fresh pdb
//   pdb.exe <file>.pdb
// if corrupt: re-export symbols from the matching binary
Defensive patterns

Strategy: try-catch

Validate before calling

// Verify the file is readable and well-formed before invoking pdb.exe
File pdb = new File(path);
if (!pdb.exists() || pdb.length() == 0) {
    throw new IOException("PDB missing or empty: " + path);
}

Try / catch

try {
    runPdbExe(pdbExeLocation, parent, name, path);
} catch (IOException e) {
    if (e.getMessage().startsWith("At file '")) {
        // stderr output - inspect the named file, re-fetch from symbol server
        popup(e.getMessage());
    } else throw e;
}

Prevention

When it happens

Trigger: Running CreatePdbXmlFilesScript on Windows against a .pdb file that pdb.exe cannot parse. Any non-empty stderr output from pdb.exe triggers it, even if the exit code is 0. Also triggered by locked/inaccessible PDB files or unsupported PDB format versions.

Common situations: Processing a corrupt or truncated .pdb downloaded from a symbol server. PDB produced by an unsupported toolchain/version. File-permission or AV-lock issues on Windows preventing pdb.exe from reading the file.

Related errors


AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14). Data as JSON: /api/errors/633c7e451d6a30fb. Report an issue: GitHub.