{"record":{"id":"f716b171431bd873","repo":"NationalSecurityAgency/ghidra","slug":"at-file-pdbname-abnormal-termination-of-pdb","errorCode":null,"errorMessage":"At file '{pdbName}':\nAbnormal termination of 'pdb.exe' process.","messagePattern":"At file '(.+?)':\nAbnormal termination of 'pdb\\.exe' process\\.","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"Ghidra/Features/Base/ghidra_scripts/CreatePdbXmlFilesScript.java","lineNumber":158,"sourceCode":"\t\treader.close();\n\n\t\tint exitValue = currentProcess.waitFor();\n\t\tString errorMessage = strBuilder.toString();\n\n\t\tif (errorMessage.length() > 0) {\n\t\t\tif (createdFile.isFile()) {\n\t\t\t\tcreatedFile.delete();\n\t\t\t}\n\n\t\t\tthrow new IOException(\"At file '\" + pdbName + \"':\\n\" + errorMessage);\n\t\t}\n\n\t\tif (exitValue != 0) {\n\t\t\tif (createdFile.isFile()) {\n\t\t\t\tcreatedFile.delete();\n\t\t\t}\n\n\t\t\tthrow new IOException(\n\t\t\t\t\"At file '\" + pdbName + \"':\\nAbnormal termination of 'pdb.exe' process.\");\n\t\t}\n\t}\n\n\tprivate void getPDBFiles(File parentDir, List<File> foundFiles) {\n\n\t\tfor (File childFile : parentDir.listFiles()) {\n\t\t\tif (childFile.isDirectory()) {\n\t\t\t\tgetPDBFiles(childFile, foundFiles);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (childFile.getName().endsWith(\".pdb\")) {\n\t\t\t\t\tfoundFiles.add(childFile);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}","sourceCodeStart":140,"sourceCodeEnd":176,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Features/Base/ghidra_scripts/CreatePdbXmlFilesScript.java#L140-L176","documentation":"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.","triggerScenarios":"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.","commonSituations":"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).","solutions":["Run pdb.exe directly on the file and check its exit code and any Windows event-log entries.","Ensure pdb.exe matches the Ghidra build and OS architecture; reinstall Ghidra if the binary is corrupted.","Free disk space and confirm write permissions on the output directory.","Exclude pdb.exe from AV/DEP interception, or run from a trusted directory."],"exampleFix":"// before\nrunPdbExe(pdbExeLocation, pdbParentDir, pdbName, currentFilePath);\n\n// after - run pdb.exe manually to see the exit code\n//   pdb.exe <file>.pdb ; echo Exit: %ERRORLEVEL%\n// then reinstall/replace pdb.exe if it crashes","handlingStrategy":"retry","validationCode":"// Run pdb.exe once out-of-band to confirm exit code 0\nProcess p = new ProcessBuilder(pdbExeLocation, path).start();\np.waitFor();\nif (p.exitValue() != 0) {\n    // do not feed this file to the script\n}","typeGuard":null,"tryCatchPattern":"try {\n    runPdbExe(...);\n} catch (IOException e) {\n    if (e.getMessage().contains(\"Abnormal termination\")) {\n        // retry once; if it persists, reinstall pdb.exe / check AV\n        runPdbExe(...);\n    } else throw e;\n}","preventionTips":["Ensure pdb.exe matches the Ghidra build and is not corrupted.","Free disk space and confirm write permission on the output dir.","Exclude pdb.exe from AV/DEP interception."],"tags":["pdb","windows","external-process","crash"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}