Autodesk CER v7 .pb Format Reference (2025+ Products)

Documented structure of the Autodesk CER v7 protobuf crash format used by 2025 and newer products. Every key across all three .pb files, with how reliably each appears in real reports.

This page documents the Autodesk CER v7 crash format: the binary protobuf .pb files written by 2025 and newer products, and still the current format today. For anything older, see the pre-2025 XML format reference.

What follows is the format as it exists in real crash reports from Civil 3D, AutoCAD, Plant 3D, Revit and Desktop Connector, plus the Autodesk background services that share the same client. Each key carries a presence rating: Always means every report has it, Usually means most do, Common means roughly half, Sometimes means a minority, Rare means do not count on it. Where a rating differs for genuine product crashes versus service telemetry, I say so.

One correction up front, because I published the opposite earlier this year. The v7 format did not lose the drawing name, the session data, or the user email. Those fields are in the files. They live under keys that most parsers, including mine, were never reading.

One crash, three files, two sidecars

crash folder<username>\<yyyy-MM-dd_epochms>\rawdata-t1.pbCRASH COREAI/CrashDate, AI/CrashUUIDAI/os/* build, kernel, localeAP/exception/* code, text, module_name, address, AV typeSP/UPI_* product, buildSP/PID, SDK_VERSION, DUMPER_VERSIONRP/CalUptime, CrashCount, Session*RP/Gdi*, RP/Avail*, RP/LastCommandAlwaysrawdata-t2.pbIDENTITY + PAYLOADAI/os/ComputerNameRP/AppXML AppInformation fragmentRP/AppName, RP/AppLocaleIdRP/UserSubscriptionEmailRP/AppCData command, stack, GDIRP/Dwg active drawingRP/GraphicsDriver, RP/Mc3*CD/CanContact, SP/DUMP_FILEAlwaysgraphic-data-t1.pbHARDWARE SNAPSHOTAI/dx.system/* OS, model, CPU, RAM, BIOS, page fileAI/dx.graphic/* installed GPU, VendorID (hex), driver, VRAMAI/d3d/* active D3D adapter + ~55 caps valuesAI/driver/Nvidia*, Ati*sometimes missing from the folderUsuallyminidump.dmp.zipzipped minidumpdialog_<ts>.userinfouser_email, computer_name,error_description (what the user typed)dialog_<ts>.analyticssession_time + dialogbutton clicksDecode each .pb with cer_rawdataviewer.exe, then merge the keys across all three files.Prefix tells you the source: AI = machine and OS, AP = native exception, SP = session parameters, CD = CER config,RP = runtime parameters the crashing application registers after startup finishes.

Decoding, and the mistake that hides half the data

The decoder ships with the CER client at C:\Program Files\Autodesk\Autodesk CER\service\cer_rawdataviewer.exe. Point it at a .pb file and it prints JSON. Two rules, both learned the hard way.

The JSON goes to stderr, with a timestamp on the first line. If you capture it with 2>&1 in a PowerShell session where $ErrorActionPreference is Stop, which it is by default in the VS Code PowerShell extension and most admin profiles, every stderr line gets wrapped in a NativeCommandError and the decode throws. Your loop catches nothing and your output has no .pb rows in it at all. There is no error message you would notice. I told people to use that redirect in an earlier post, and for a stretch my own parser was silently dropping every .pb file because of it.

Start the process yourself instead. System.Diagnostics.Process with redirected streams in PowerShell, or subprocess.run(capture_output=True) reading .stderr in Python. Strip everything before the first curly brace and parse. That path does not care what your error preference is set to.

Every leaf is a list. The decoded shape is {"params": {"<key>": {"value": [...]}}}, and several keys are legitimately multi-value. Take index zero if you want one, join with a separator if you want them all, but do not assume a scalar.

rawdata-t1.pbrawdata-t2.pbgraphic-data-t1.pbcer_rawdataviewer.exeJSON goes to STDERRstrip the timestamp prefixnever capture with 2>&1params{}key -> value[]about 200 keysMAPPEDCSV columns for statistics and trendsACKNOWLEDGED, NOT MAPPEDlisted with a reason, still visible in the raw viewNEW OR UNKNOWNcoverage check fails by name the day it appearsThe decoder emits every key in the file. The failure mode is a parser that reads a fixed list and quietly drops the rest.Keep all decoded keys on the record, and diff what the decoder emits against what your parser reads on a schedule.

rawdata-t1.pb: the crash core

KeyPresenceNotes
AI/CrashDateAlwaysMM/DD/YYYY, local date of the crash
AI/CrashUUIDAlwayscrash GUID, joins the backend CER number
AI/os/KindAlwaysWindows
AI/os/BuildNumberAlwaysWindows display build, e.g. 26200
AI/os/MajorVersion, AI/os/MinorVersionAlwaysalways 10.0. Use BuildNumber to tell Win10 from Win11
AI/os/KernelBuildNum, KernelMajorVersion, KernelMinorVersion, KernelReleaseNumAlwayskernel identity. ReleaseNum is the UBR patch level
AI/os/PlatformId, CSDVersion, ServicePackMajor, ServicePackMinor, SuiteFlagsAlwayslegacy OS descriptors
AI/os/Distributor, AI/os/ProductTypeAlwaysProductType 1 is workstation
AI/os/SystemDefault.ICountry, .IDefaultAnsiCodepage, .IDefaultCodepage, .IDefaultCountry, .IDefaultLanguage, .ILanguageAlwayssystem locale. Constant across a single-locale fleet
AI/os/UserDefault.ICountry, .IDefaultAnsiCodepage, .IDefaultCodepage, .IDefaultCountry, .IDefaultLanguage, .ILanguageAlwaysuser locale
AI/os/Wininet.BuildNum, .MajorVersion, .MinorVersion, .ReleaseNum, .OthersAlwaysWinINet version block
AP/exception/codeUsuallyNT status. 0xC0000005 access violation, 0x80000003 breakpoint, 0xE0000001 and up are app defined
AP/exception/textUsuallysymbolic name, e.g. ACCESS_VIOLATION, BREAKPOINT
AP/exception/module_nameUsuallythe faulting module. The single best signature in the format, and the XML never had it
AP/exception/addressUsuallyfaulting instruction address
AP/exception/misc/win_message_queue_fullUsually1 means the UI message queue was saturated at crash
AP/exception/misc/utf8_beta_enabledUsuallyWindows UTF-8 beta setting
AP/exception/access_violation/typeCommonread, write or execute. Access violations only
AP/exception/access_violation/addressCommontarget address. 0x0 or 0xFFFF… means null-ish
AP/exception/access_violation/accessing_null_ptrCommonexplicit null dereference flag
AP/exception/access_violation/pg_StatusSometimespage guard status
CD/SubscriptionMacIDAlwayssubscription machine GUID. Joins the XML UserSubscription macID
SP/PIDAlwayscrashing process id
SP/THREAD_IDUsuallycrashing thread id
SP/RUNTIME_ARCHAlways1 is x64
SP/SDK_VERSION, SP/DUMPER_VERSIONAlwaystelemetry SDK and dumper builds. Dates the CER client
SP/DEVICEID2, SP/UUIDAlwayshashed machine identity. Joins the XML DeviceIDv2
SP/EXCEPTION_INFO_POINTERAlwaysraw pointer value, no analytic use
SP/DUMP_OPTIONSAlwaysminidump flags
SP/UPI_PRODUCTCommonproduct code, e.g. CIV3D, ADP-SDK, AGS, INFWP. A large share of .pb reports carry no UPI block at all; see identity resolution below
SP/UPI_BUILDCommonthe real build, e.g. 13.8.1809.0. Use this for version mapping
SP/UPI_RELEASECommonyear only. Do not use as a version
SP/UPI_MASTERCommonproduct master GUID
SP/UPI_FULL_XMLCommonembedded upipackage inventory. The requestingapp entry inside it is the ADP reporter, not the crashing app
SP/WERSometimeswhether Windows Error Reporting also fired
SP/THEME_TYPESometimesapp UI theme, Blue or Dark
RP/HeadlessSometimesheadless or console session flag
RP/CalUptimeSometimes100 ns ticks since app start
RP/CrashCountSometimesrunning per-machine crash counter. Partial replacement for CrashHistory
RP/SessionStartCount, RP/SessionEndCount, RP/CurrentSessionLengthSometimessession health. Length is in seconds
RP/GdiUserObjectsSometimesUSER handle count
RP/GdiObjects, RP/GdiObjectsPeak, RP/GdiUserObjectsPeakRareGDI counts and peaks. Peak far above current is a leak
RP/AvailPageFile, RP/AvailPhysicalMem, RP/AvailVirtualMemRarebytes, arriving as hex or decimal. Detect before converting
RP/LastCommandRarea multi-value command chain, most recent first
RP/ErrNoRareCRT errno
RP/LastErrorVestigialWin32 last error

The RP/ ratings here are across every .pb report, including service telemetry that never had a session to describe. In product crashes that reached a working session before they died, these keys are common. See the section on thin reports.

rawdata-t2.pb: the file that was hiding everything

If you only ever opened rawdata-t1.pb, which is the natural thing to do, this is what you missed.

KeyPresenceNotes
CD/CanContactAlwaysuser allows contact
SP/DUMP_FILEAlwaysdump path when written, often empty
AI/os/ComputerNameUsuallythe only machine name anywhere in the .pb set
CD/MaxRetainedCountCommonhow many reports CER keeps locally
RP/AppNameSometimesraw process name, e.g. ADPClientService. Identity fallback, second choice
RP/AppXMLSometimesliteral AppInformation and ProductInformation XML fragments, the same content the old format carried as elements, including git_commit_id and install_id_string. Identity fallback, first choice
RP/AppLocaleIdSometimese.g. 1033
RP/SerialNumSometimesalways masked
RP/CadSettingsRegPathSometimesregistry path. Encodes the AutoCAD release and install id
CD/EnableRequiredSend, CD/EnableRoundTrip, CD/EnableSendPCNameSometimesCER policy flags
RP/AppIconIdSometimesdialog cosmetics
CD/SecondDumpFile, CD/SecondDumpFlagsRarebig-dump configuration, e.g. acminidump_big.dmp
RP/UserSubscriptionEmailRarethe user email
RP/Mc3UserId, RP/Mc3SessionIdRareanalytics identity. Joins the XML MC3Info
RP/AppCDataRarethe same payload as the XML AppCDATA block: Command prefix, CLR info, first-chance managed exceptions with the doubled carriage return before each frame, and the GDI and handle tail
AP/uptimeRareprocess uptime in 100 ns ticks
RP/GraphicsDriverRarethe AutoCAD hdi driver, e.g. acaddm17.hdi
RP/DwgRarethe active drawing. This is the key I said was gone. Single document only, no open-files list
RP/AppIcon, RP/ExtraFileRareicon source DLL and an extra attached file, e.g. an installer log
RP/LicBehavior, RP/LicExp, RP/LicUsageRarelicensing state
RP/FeatureName, RP/FeatureVerVestigiallicensed feature, e.g. INFWP 2027.0.0.F

Those Rare ratings are across the whole .pb population, which includes a lot of ADP, Genuine Service and installer telemetry that never had a drawing to report in the first place. Narrow it to genuine product crashes and the picture changes: the drawing name and last command show up in roughly half, and AppCData in most.

graphic-data-t1.pb: the hardware snapshot

KeyPresenceNotes
AI/dx.system/OperatingSystem, Processor, SystemMemory, SystemManufacturer, SystemModel, BIOS, PageFile, Language, FullDirectXVersion, DxDiagVersionAlwaysthe DxDiag system block. SystemModel is what drives laptop and muxless detection
AI/dx.graphic/Manufacturer, ChipType, DACType, VendorID, DeviceID, SubSystemID, RevisionID, GraphicsHWMemory, DisplayMode, GraphicsDriverFile, DriverFileVersion, DriverDate, DriverSigned, DriverSignedValid, WHQLLevel, DxDiagWHQLLevel, DirectXVersion, DDIVersion, DDIVersionNumberAlwaysthe installed GPU. VendorID is a hex string: 0x10DE NVIDIA, 0x8086 Intel, 0x1002 AMD
AI/driver/NvidiaDriverVersion, NvidiaDriverDesc, AtiPackagingVersionAlwaysvendor driver detail
AI/d3d/Description, Driver, DriverVersion, DeviceName, VendorId, DeviceId, SubSysId, Revision, DeviceType, WHQLLevel, AdapterOrdinal, MasterAdapterOrdinal, AdapterOrdinalInGroup, NumberOfAdaptersInGroupUsuallythe active D3D adapter. VendorId here is decimal, so 4318 is the same NVIDIA as 0x10DE above
AI/d3d capability keys: Caps, Caps2, Caps3, Presentation, Cursor, Dev, Dev2, PrimitiveMisc, Raster, ZCmp, SrcBlend, DestBlend, AlphaCmp, Shade, Texture, TextureFilter, CubeTextureFilter, VolumeTextureFilter, TextureAddress, VolumeTextureAddress, Line, MaxTextureWidth, MaxTextureHeight, MaxVolumeExtent, MaxTextureRepeat, MaxTextureAspectRatio, MaxAnisotropy, MaxVertexW, GuardBandLeft, GuardBandTop, GuardBandRight, GuardBandBottom, ExtentsAdjust, Stencil, FVF, TextureOp, MaxTextureBlendStages, MaxSimultaneousTextures, VertexProcessing, MaxActiveLights, MaxUserClipPlanes, MaxVertexBlendMatrices, MaxVertexBlendMatrixIndex, MaxPointSize, MaxPrimitiveCount, MaxVertexIndex, MaxStreams, MaxStreamStride, VertexShaderVersion, MaxVertexShaderConst, PixelShaderVersion, PixelShader1xMaxValue, DeclTypes, NumSimultaneousRTs, StretchRectFilter, VertexTextureFilter, MaxVShaderInstructionsExecuted, MaxPShaderInstructionsExecuted, MaxVertexShader30InstructionSlots, MaxPixelShader30InstructionSlotsUsuallydevice capability data. Complete for the record, no diagnostic value
AI/d3d/ErrorRarereplaces the caps block, e.g. “cannot get device caps, error 0x8876086A”. That is itself a graphics fault signal

Two traps here. This file is sometimes missing from the crash folder entirely, and when it is gone there is no GPU or system detail anywhere in the crash. And when dx.graphic names one adapter while d3d names another, you are looking at muxless or Optimus routing, which is the .pb equivalent of the XML GsConfig versus OpenGL mismatch.

Why some reports are thin, and why it is not the format’s fault

The RP/ keys are registered by the application after it finishes starting up. Crash before that point and the report ships without a drawing, a command, an email, or session counts. It is not a format limitation and it is not a client version difference. It is when the crash happened.

Crash A: while opening a drawingAI/os, AP/exception, SP/* presentRP/Dwg missingRP/LastCommand missingRP/AppCData, session counts missingCrash B: mid-session REGEN, four minutes laterRP/Dwg, RP/LastCommand chain,RP/AppCData, RP/Avail*, RP/Gdi* + peaks,session counts, email, faulting modulenearly everything the XML format carriedapp launchstartup completeRP/ params registered hereworking sessionSame user, same machine, same CER client. The only variable is when the crash landed.Treat a thin report as a startup-crash marker. Drawing-open crashes will always under-report the drawing name.

The practical consequence is worth stating plainly. Drawing-open crashes are one of the bigger vectors any CAD manager chases, and they are exactly the population that reports without a drawing name. Any drawing-level crash statistic you build from .pb data is a floor, not a count. I have asked Autodesk to register those values earlier in startup.

The two JSON sidecars

dialog_20260904174313.userinfo
{"user_email":"","subscription_email":"","error_description":"Opening a drawing",
"view_test_data":0,"computer_name":"PC-11331","locale_id":1033}
dialog_20260904174324.analytics
{"session_time":31,"view_detail_button":false,"learn_more_button":false,
"solution_url":false,"readme_url":false}
KeyFileNotes
user_email, subscription_email.userinfofilled when the user is signed in
error_description.userinfowhat the user typed into the CER dialog. Workflow context no crash field has ever carried
computer_name.userinfomachine name, overrides AI/os/ComputerName
locale_id.userinfoe.g. 1033
view_test_data.userinfodialog test flag
session_time.analyticsseconds the CER dialog stayed open
view_detail_button, learn_more_button, solution_url, readme_url.analyticswhether the user clicked each one

Both files always carry all their keys, though the values are often empty strings. The dialog runs after the dump, so error_description survives even when the report itself is thin. It is the most underrated field in the whole v7 package.

Identity resolution, in the order that works

  1. Username from the folder path. There is no username key in .pb.
  2. Product from SP/UPI_PRODUCT, then the AppInformation name inside RP/AppXML, then RP/AppName.
  3. Version from SP/UPI_BUILD, then the AppXML version, then SP/UPI_RELEASE as a last resort since it is only a year.
  4. Email from RP/UserSubscriptionEmail, then the .userinfo sidecar.
  5. Machine name from .userinfo, then AI/os/ComputerName.
  6. Crash time from the file write time. The folder name is the collection date.

A KERNELBASE breakpoint report with no UPI block and no RP/AppName cannot be identified from the .pb content at all. Classify it from the minidump or leave it unattributed. Do not guess.

Where each field lives, XML against v7

FieldXML (pre-2025).pb v7 (2025+)
Crash id and dateUserInfo/ErrorDescription @CrashID @CrashDateAI/CrashUUID, AI/CrashDate
Crashing product and buildupipackage requestingapp entrySP/UPI_PRODUCT + SP/UPI_BUILD, else RP/AppXML
Active drawingUserInfo/WorkingDocumentRP/Dwg
Open-files listchild elements named after each fileno equivalent
Last command chainAppCDATA Command prefixRP/LastCommand or RP/AppCData
Managed stackAppCDATA + CDXStackDump*.xmlRP/AppCData
Faulting native moduleno equivalentAP/exception/module_name + AV direction
Memory at crashProcessInfo @Avail* (hex)RP/Avail* (hex or decimal)
GDI and handle countsGsConfig/GDI or AppCDATA tailRP/GdiObjects*
Session healthProductInformation @session_*_countRP/SessionStartCount / EndCount
Installed GPU and systemDxDiagInfo/*AI/dx.graphic/*, AI/dx.system/*
Active render adapterGraphicsInfo + GsConfig/CardAI/d3d/*
OpenGL rendererOpenGLInfono equivalent
Upload reliabilityCrashHistory @Backend*no equivalent, only RP/CrashCount
User’s own descriptionno equivalentdialog_*.userinfo error_description

Four rows say “no equivalent.” Everything else survived the format change. It just moved to a key nobody was reading, which is a different problem with a much easier fix.

Two habits that keep this from happening again

Keep every decoded key on the record, even the ones you do not map into columns. When two crashes look identical in your mapped fields, the difference is sitting in the ones you threw away. My crash viewer shows the full raw key set in its own tab for exactly this reason.

Diff what the decoder emits against what your parser reads, on a schedule. Any key that is neither mapped nor written down somewhere with a reason for skipping it should fail loudly. When I finally ran that diff, a long list of keys came back that no parser of mine had ever touched, and the drawing name was one of them.


Reference pages get updated rather than replaced. If Autodesk adds a key or changes the client, this page changes with it.

Cheers,
Shaan