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
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.pb: the crash core
| Key | Presence | Notes |
|---|---|---|
AI/CrashDate | Always | MM/DD/YYYY, local date of the crash |
AI/CrashUUID | Always | crash GUID, joins the backend CER number |
AI/os/Kind | Always | Windows |
AI/os/BuildNumber | Always | Windows display build, e.g. 26200 |
AI/os/MajorVersion, AI/os/MinorVersion | Always | always 10.0. Use BuildNumber to tell Win10 from Win11 |
AI/os/KernelBuildNum, KernelMajorVersion, KernelMinorVersion, KernelReleaseNum | Always | kernel identity. ReleaseNum is the UBR patch level |
AI/os/PlatformId, CSDVersion, ServicePackMajor, ServicePackMinor, SuiteFlags | Always | legacy OS descriptors |
AI/os/Distributor, AI/os/ProductType | Always | ProductType 1 is workstation |
AI/os/SystemDefault.ICountry, .IDefaultAnsiCodepage, .IDefaultCodepage, .IDefaultCountry, .IDefaultLanguage, .ILanguage | Always | system locale. Constant across a single-locale fleet |
AI/os/UserDefault.ICountry, .IDefaultAnsiCodepage, .IDefaultCodepage, .IDefaultCountry, .IDefaultLanguage, .ILanguage | Always | user locale |
AI/os/Wininet.BuildNum, .MajorVersion, .MinorVersion, .ReleaseNum, .Others | Always | WinINet version block |
AP/exception/code | Usually | NT status. 0xC0000005 access violation, 0x80000003 breakpoint, 0xE0000001 and up are app defined |
AP/exception/text | Usually | symbolic name, e.g. ACCESS_VIOLATION, BREAKPOINT |
AP/exception/module_name | Usually | the faulting module. The single best signature in the format, and the XML never had it |
AP/exception/address | Usually | faulting instruction address |
AP/exception/misc/win_message_queue_full | Usually | 1 means the UI message queue was saturated at crash |
AP/exception/misc/utf8_beta_enabled | Usually | Windows UTF-8 beta setting |
AP/exception/access_violation/type | Common | read, write or execute. Access violations only |
AP/exception/access_violation/address | Common | target address. 0x0 or 0xFFFF… means null-ish |
AP/exception/access_violation/accessing_null_ptr | Common | explicit null dereference flag |
AP/exception/access_violation/pg_Status | Sometimes | page guard status |
CD/SubscriptionMacID | Always | subscription machine GUID. Joins the XML UserSubscription macID |
SP/PID | Always | crashing process id |
SP/THREAD_ID | Usually | crashing thread id |
SP/RUNTIME_ARCH | Always | 1 is x64 |
SP/SDK_VERSION, SP/DUMPER_VERSION | Always | telemetry SDK and dumper builds. Dates the CER client |
SP/DEVICEID2, SP/UUID | Always | hashed machine identity. Joins the XML DeviceIDv2 |
SP/EXCEPTION_INFO_POINTER | Always | raw pointer value, no analytic use |
SP/DUMP_OPTIONS | Always | minidump flags |
SP/UPI_PRODUCT | Common | product 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_BUILD | Common | the real build, e.g. 13.8.1809.0. Use this for version mapping |
SP/UPI_RELEASE | Common | year only. Do not use as a version |
SP/UPI_MASTER | Common | product master GUID |
SP/UPI_FULL_XML | Common | embedded upipackage inventory. The requestingapp entry inside it is the ADP reporter, not the crashing app |
SP/WER | Sometimes | whether Windows Error Reporting also fired |
SP/THEME_TYPE | Sometimes | app UI theme, Blue or Dark |
RP/Headless | Sometimes | headless or console session flag |
RP/CalUptime | Sometimes | 100 ns ticks since app start |
RP/CrashCount | Sometimes | running per-machine crash counter. Partial replacement for CrashHistory |
RP/SessionStartCount, RP/SessionEndCount, RP/CurrentSessionLength | Sometimes | session health. Length is in seconds |
RP/GdiUserObjects | Sometimes | USER handle count |
RP/GdiObjects, RP/GdiObjectsPeak, RP/GdiUserObjectsPeak | Rare | GDI counts and peaks. Peak far above current is a leak |
RP/AvailPageFile, RP/AvailPhysicalMem, RP/AvailVirtualMem | Rare | bytes, arriving as hex or decimal. Detect before converting |
RP/LastCommand | Rare | a multi-value command chain, most recent first |
RP/ErrNo | Rare | CRT errno |
RP/LastError | Vestigial | Win32 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.
| Key | Presence | Notes |
|---|---|---|
CD/CanContact | Always | user allows contact |
SP/DUMP_FILE | Always | dump path when written, often empty |
AI/os/ComputerName | Usually | the only machine name anywhere in the .pb set |
CD/MaxRetainedCount | Common | how many reports CER keeps locally |
RP/AppName | Sometimes | raw process name, e.g. ADPClientService. Identity fallback, second choice |
RP/AppXML | Sometimes | literal 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/AppLocaleId | Sometimes | e.g. 1033 |
RP/SerialNum | Sometimes | always masked |
RP/CadSettingsRegPath | Sometimes | registry path. Encodes the AutoCAD release and install id |
CD/EnableRequiredSend, CD/EnableRoundTrip, CD/EnableSendPCName | Sometimes | CER policy flags |
RP/AppIconId | Sometimes | dialog cosmetics |
CD/SecondDumpFile, CD/SecondDumpFlags | Rare | big-dump configuration, e.g. acminidump_big.dmp |
RP/UserSubscriptionEmail | Rare | the user email |
RP/Mc3UserId, RP/Mc3SessionId | Rare | analytics identity. Joins the XML MC3Info |
RP/AppCData | Rare | the 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/uptime | Rare | process uptime in 100 ns ticks |
RP/GraphicsDriver | Rare | the AutoCAD hdi driver, e.g. acaddm17.hdi |
RP/Dwg | Rare | the active drawing. This is the key I said was gone. Single document only, no open-files list |
RP/AppIcon, RP/ExtraFile | Rare | icon source DLL and an extra attached file, e.g. an installer log |
RP/LicBehavior, RP/LicExp, RP/LicUsage | Rare | licensing state |
RP/FeatureName, RP/FeatureVer | Vestigial | licensed 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
| Key | Presence | Notes |
|---|---|---|
AI/dx.system/OperatingSystem, Processor, SystemMemory, SystemManufacturer, SystemModel, BIOS, PageFile, Language, FullDirectXVersion, DxDiagVersion | Always | the 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, DDIVersionNumber | Always | the installed GPU. VendorID is a hex string: 0x10DE NVIDIA, 0x8086 Intel, 0x1002 AMD |
AI/driver/NvidiaDriverVersion, NvidiaDriverDesc, AtiPackagingVersion | Always | vendor driver detail |
AI/d3d/Description, Driver, DriverVersion, DeviceName, VendorId, DeviceId, SubSysId, Revision, DeviceType, WHQLLevel, AdapterOrdinal, MasterAdapterOrdinal, AdapterOrdinalInGroup, NumberOfAdaptersInGroup | Usually | the 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, MaxPixelShader30InstructionSlots | Usually | device capability data. Complete for the record, no diagnostic value |
AI/d3d/Error | Rare | replaces 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.
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}
| Key | File | Notes |
|---|---|---|
user_email, subscription_email | .userinfo | filled when the user is signed in |
error_description | .userinfo | what the user typed into the CER dialog. Workflow context no crash field has ever carried |
computer_name | .userinfo | machine name, overrides AI/os/ComputerName |
locale_id | .userinfo | e.g. 1033 |
view_test_data | .userinfo | dialog test flag |
session_time | .analytics | seconds the CER dialog stayed open |
view_detail_button, learn_more_button, solution_url, readme_url | .analytics | whether 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
- Username from the folder path. There is no username key in .pb.
- Product from
SP/UPI_PRODUCT, then the AppInformation name insideRP/AppXML, thenRP/AppName. - Version from
SP/UPI_BUILD, then the AppXML version, thenSP/UPI_RELEASEas a last resort since it is only a year. - Email from
RP/UserSubscriptionEmail, then the .userinfo sidecar. - Machine name from .userinfo, then
AI/os/ComputerName. - 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
| Field | XML (pre-2025) | .pb v7 (2025+) |
|---|---|---|
| Crash id and date | UserInfo/ErrorDescription @CrashID @CrashDate | AI/CrashUUID, AI/CrashDate |
| Crashing product and build | upipackage requestingapp entry | SP/UPI_PRODUCT + SP/UPI_BUILD, else RP/AppXML |
| Active drawing | UserInfo/WorkingDocument | RP/Dwg |
| Open-files list | child elements named after each file | no equivalent |
| Last command chain | AppCDATA Command prefix | RP/LastCommand or RP/AppCData |
| Managed stack | AppCDATA + CDXStackDump*.xml | RP/AppCData |
| Faulting native module | no equivalent | AP/exception/module_name + AV direction |
| Memory at crash | ProcessInfo @Avail* (hex) | RP/Avail* (hex or decimal) |
| GDI and handle counts | GsConfig/GDI or AppCDATA tail | RP/GdiObjects* |
| Session health | ProductInformation @session_*_count | RP/SessionStartCount / EndCount |
| Installed GPU and system | DxDiagInfo/* | AI/dx.graphic/*, AI/dx.system/* |
| Active render adapter | GraphicsInfo + GsConfig/Card | AI/d3d/* |
| OpenGL renderer | OpenGLInfo | no equivalent |
| Upload reliability | CrashHistory @Backend* | no equivalent, only RP/CrashCount |
| User’s own description | no equivalent | dialog_*.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