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
- Re-download or regenerate the offending .pdb (the message names it).
- Check that the .pdb is not locked by another process (debugger, AV) on Windows.
- Verify the PDB format matches the pdb.exe version shipped with your Ghidra build.
- 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
- Run pdb.exe manually on a suspect PDB to view the full stderr.
- Re-fetch PDBs from the symbol server if a parse error suggests corruption.
- Ensure the file is not locked by a debugger or AV.
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
- At file '{pdbName}': Abnormal termination of 'pdb.exe' proce
- gdis execution error
- GNU disassembler process died unexpectedly.
- headless use not supported
- Unsupported language.
AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14).
Data as JSON: /api/errors/633c7e451d6a30fb.
Report an issue: GitHub.