NationalSecurityAgency/ghidra · error · IOException

At file '{pdbName}': Abnormal termination of 'pdb.exe' proce

Error message

At file '{pdbName}':
Abnormal termination of 'pdb.exe' process.

What it means

Thrown by CreatePdbXmlFilesScript.runPdbExe when pdb.exe exits with a non-zero code (after stderr was empty). The partially-created .pdb.xml is deleted and an IOException reporting abnormal termination is raised. This is distinct from the stderr case: it means the helper crashed or was killed without writing to stderr.

Source

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

		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);
			}
			else {
				if (childFile.getName().endsWith(".pdb")) {
					foundFiles.add(childFile);
				}
			}
		}
	}
}

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Run pdb.exe directly on the file and check its exit code and any Windows event-log entries.
  2. Ensure pdb.exe matches the Ghidra build and OS architecture; reinstall Ghidra if the binary is corrupted.
  3. Free disk space and confirm write permissions on the output directory.
  4. Exclude pdb.exe from AV/DEP interception, or run from a trusted directory.

Example fix

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

// after - run pdb.exe manually to see the exit code
//   pdb.exe <file>.pdb ; echo Exit: %ERRORLEVEL%
// then reinstall/replace pdb.exe if it crashes
Defensive patterns

Strategy: retry

Validate before calling

// Run pdb.exe once out-of-band to confirm exit code 0
Process p = new ProcessBuilder(pdbExeLocation, path).start();
p.waitFor();
if (p.exitValue() != 0) {
    // do not feed this file to the script
}

Try / catch

try {
    runPdbExe(...);
} catch (IOException e) {
    if (e.getMessage().contains("Abnormal termination")) {
        // retry once; if it persists, reinstall pdb.exe / check AV
        runPdbExe(...);
    } else throw e;
}

Prevention

When it happens

Trigger: Calling runPdbExe where pdb.exe terminates with exitValue != 0 and no stderr. Caused by pdb.exe crashing, being killed by a signal, hitting an unhandled internal error, or running out of memory/disk.

Common situations: pdb.exe crashes on a malformed PDB without printing diagnostics. Antivirus or Data Execution Prevention kills pdb.exe. Insufficient disk space for the .pdb.xml output. Architecture mismatch (32-bit pdb.exe on a PDB it can't handle).

Related errors


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