{"componentChunkName":"component---src-templates-platform-tsx","path":"/platforms/native/guides/crashpad/data-management/debug-files/","result":{"data":{"file":{"id":"6dabc27b-9cba-554b-b2a9-ea1feb87bd8c","relativePath":"common/data-management/debug-files.mdx","sourceInstanceName":"platforms","childMarkdownRemark":null,"childMdx":{"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Debug Information Files\",\n  \"sidebar_order\": 7,\n  \"redirect_from\": [\"/workflow/debug-files/\"],\n  \"supported\": [\"native\", \"android\", \"cocoa\"]\n};\n\nvar makeShortcode = function makeShortcode(name) {\n  return function MDXDefaultShortcode(props) {\n    console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\");\n    return mdx(\"div\", props);\n  };\n};\n\nvar Note = makeShortcode(\"Note\");\nvar CodeTabs = makeShortcode(\"CodeTabs\");\nvar CodeBlock = makeShortcode(\"CodeBlock\");\nvar Alert = makeShortcode(\"Alert\");\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Debug information files allow Sentry to extract stack traces and provide more\\ninformation about crash reports for most compiled platforms. Information stored\\nin debug files includes original function names, paths to source files and line\\nnumbers, source code context, or the placement of variables in memory. Sentry\\ncan use some of this information and display it on the issue details page.\"), mdx(\"p\", null, \"Each major platform uses different debug information files. We currently support\\nthe following formats:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"#macho-and-dsym\"\n  }), mdx(\"em\", {\n    parentName: \"a\"\n  }, \"dSYM files\")), \" for iOS, iPadOS,\\ntvOS, watchOS, and macOS\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"#executable-and-linkable-format-elf\"\n  }), mdx(\"em\", {\n    parentName: \"a\"\n  }, \"ELF symbols\")), \" for Linux and\\nAndroid (NDK)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"#pe-and-pdb\"\n  }), mdx(\"em\", {\n    parentName: \"a\"\n  }, \"PDB files\")), \" for Windows\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"#breakpad-symbols\"\n  }), mdx(\"em\", {\n    parentName: \"a\"\n  }, \"Breakpad symbols\")), \" for all\\nplatforms\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"#proguard-mappings\"\n  }), mdx(\"em\", {\n    parentName: \"a\"\n  }, \"ProGuard mappings\")), \" for\\nJava and Android\")), mdx(Note, {\n    mdxType: \"Note\"\n  }, mdx(\"markdown\", null, mdx(\"p\", null, \"Source maps, while also being debug information files, are handled\\nin Sentry. For more information see \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"/product/cli/releases/#sentry-cli-sourcemaps\"\n  }), \"Source Maps in sentry-cli\"), \".\"), mdx(\"p\", null, \"differently\"))), mdx(\"p\", null, \"Sentry requires access to debug information files of your application as well as\\nsystem libraries to provide fully symbolicated crash reports. You can either\\n\", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"#uploading-files\"\n  }), \"upload\"), \" your files to Sentry or put them on a compatible\\n\", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"#symbol-servers\"\n  }), \"Symbol Server\"), \" to be downloaded by Sentry when needed.\"), mdx(\"p\", null, \"Debug information files can be managed on the \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Debug Files\"), \" section in \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Project\\nSettings\"), \". This page lists all uploaded files and allows to configure symbol\\nservers for automatic downloads.\"), mdx(\"h2\", {\n    \"id\": \"debug-information\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#debug-information\",\n    \"aria-label\": \"debug information permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Debug Information\"), mdx(\"p\", null, \"Sentry differentiates in four kinds of debug information:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Unwind Information:\"), \" Enables Sentry to extract stack traces from Minidumps\\nand other binary crash formats of optimized builds. This process is referred\\nto as \\\"stack unwinding\\\" or \\\"stack walking\\\". Since this is also required when\\nthrowing exceptions in C++, this information is often included in the\\nexecutable or library. If an uploaded file contains this information, it shows\\nthe \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"unwind\"), \" tag.\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Debug Information:\"), \" Provides function names, paths to source files, line\\nnumbers and inline frames. The process of resolving this information from\\ninstruction addresses is called \\\"symbolication\\\". This information is\\nrelatively large compared to the executable and usually put into a separate\\nfile. In Sentry, these files are designated as \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"debug companions\"), \" and show the\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"debug\"), \" tag.\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Symbol Tables:\"), \" If debug information is not available for a certain\\nlibrary, Sentry can use symbol tables as a fallback to retrieve function\\nnames. Symbol tables are usually included in both the executable and debug\\ncompanion files. However, they do not contain sufficient information to\\nresolve inline functions or file names and line numbers. The \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"symtab\"), \" tag\\nindicates symbol tables.\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Source Code:\"), \" Conventionally, source code is not part of regular debug\\ninformation files. Sentry CLI can bundle source code of your application and\\nupload it to display source context in stack traces in Sentry. These bundles\\nshow up with the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sources\"), \" tag.\"))), mdx(\"p\", null, \"Compilers place the above debug information in different files passed on the\\ntarget platform, architecture, build flags or optimization level. Consequently,\\nSentry might not need all of the above information to process crash reports.\\nStill, it is always a good idea to provide all available debug information.\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sentry-cli\"), \" can be used to list properties of supported debug files and\\nvalidate their contents. See \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"/product/cli/dif/\"\n  }), mdx(\"em\", {\n    parentName: \"a\"\n  }, \"Debug Information Files in sentry-cli\")), \" for more information.\"), mdx(\"p\", null, \"The remainder of this section describes the file formats in detail.\"), mdx(\"h3\", {\n    \"id\": \"macho-and-dsym\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#macho-and-dsym\",\n    \"aria-label\": \"macho and dsym permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"MachO and dSYM\"), mdx(\"p\", null, \"Executables, dynamic libraries and debug companions on all Apple platforms use\\nthe \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Mach Object\"), \", or short \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"MachO\"), \", container format. This applies to iOS,\\niPadOS, tvOS, watchOS, and macOS.\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Executables\"), \" do not carry a file extension. For desktop applications, they\\nare often placed in app bundle structures with the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".app\"), \" suffix. Unless\\nstripped manually, executables contain unwind information and a symbol table.\\nDebug information is never stored in executables.\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Dynamic Libraries\"), \" use the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".dylib\"), \" extension, and otherwise behave exactly\\nthe same as executables.\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Debug Companions\"), \" are placed in a folder structure with the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".dSYM\"), \"\\nextension, and are located at \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"<name>.dSYM/Contents/Resources/DWARF/<name>\"), \".\\nThey usually contain a symbol table and debug information, but rarely unwind\\ninformation.\"))), mdx(\"p\", null, \"When building an application with Xcode or with the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"clang\"), \" compiler, debug\\ninformation is automatically placed in a dSYM file. When linking manually,\\nhowever, the dSYM file must be created using the following command:\"), mdx(\"div\", {\n    \"className\": \"code-tabs-wrapper\"\n  }, mdx(CodeTabs, {\n    mdxType: \"CodeTabs\"\n  }, mdx(CodeBlock, {\n    language: \"bash\",\n    title: \"\",\n    filename: \"\",\n    mdxType: \"CodeBlock\"\n  }, mdx(\"div\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"gatsby-highlight\",\n    \"data-language\": \"bash\"\n  }), mdx(\"pre\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"language-bash\"\n  }), mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"dsymutil /path/to/output\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"[\"), \".dylib\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"]\"))))))), mdx(\"h3\", {\n    \"id\": \"executable-and-linkable-format-elf\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#executable-and-linkable-format-elf\",\n    \"aria-label\": \"executable and linkable format elf permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Executable and Linkable Format (ELF)\"), mdx(\"p\", null, \"On Linux distributions, executables and debug information are stored in \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"ELF\"), \"\\ncontainers. Unlike other platforms, there is no dedicated container or specifier\\nfor debug companion files.\"), mdx(\"p\", null, \"Debug information is part of the binary (executable or library) and stripped\\nwhen generating release builds due to their size. However, there is a way to\\nretain them in a separate file (either in a different location or with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".debug\"), \"\\nextension):\"), mdx(\"div\", {\n    \"className\": \"code-tabs-wrapper\"\n  }, mdx(CodeTabs, {\n    mdxType: \"CodeTabs\"\n  }, mdx(CodeBlock, {\n    language: \"bash\",\n    title: \"\",\n    filename: \"\",\n    mdxType: \"CodeBlock\"\n  }, mdx(\"div\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"gatsby-highlight\",\n    \"data-language\": \"bash\"\n  }), mdx(\"pre\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"language-bash\"\n  }), mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token comment\"\n  }), \"# There is an executable called \\\"binary\\\" in the CWD\"), \"\\nobjcopy --only-keep-debug binary binary.debug\\nobjcopy --strip-debug --strip-unneeded binary\\nobjcopy --add-gnu-debuglink\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token operator\"\n  }), \"=\"), \"binary.debug binary\")))))), mdx(\"p\", null, \"This results in the following structure:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Executables\"), \" do not carry a file extension. If stripped like above,\\nexecutables contain a symbol table, but no debug information. If the build\\nrun omits frame pointers, unwind information will also be retained. Both can\\nbe further stripped using flags like \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"--strip-all\"), \".\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Shared Libraries\"), \" use the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".so\"), \" extension, and otherwise behave exactly\\nthe same as executables.\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Debug Companions\"), \" do not carry a standard file extension, but are often\\nnamed \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".debug\"), \". If stripped like above, these files contain unwind\\ninformation, debug information and a symbol table.\"))), mdx(\"p\", null, \"Shared libraries installed via package managers usually provide their debugging\\ninformation in separate \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"*-dev\"), \" packages and put it in locations like\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"/usr/local/debug/...\"), \". To receive symbolicated stack traces from those\\nlibraries, make sure to also upload their symbols in addition to your app\\u2019s\\nsymbols.\"), mdx(\"p\", null, \"ELF supports the compression of debug information which can significantly reduce\\nthe time required to upload debug information files to Sentry and thus improve\\nbuild times. \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"gcc\"), \" (version 5 or newer) and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"clang\"), \" (version 5 or newer) support\\nthis by passing the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"-gz\"), \" flag to both the compiler and linker. The common way\\nto compress debug information, however, is when stripping the executable:\"), mdx(\"div\", {\n    \"className\": \"code-tabs-wrapper\"\n  }, mdx(CodeTabs, {\n    mdxType: \"CodeTabs\"\n  }, mdx(CodeBlock, {\n    language: \"bash\",\n    title: \"\",\n    filename: \"\",\n    mdxType: \"CodeBlock\"\n  }, mdx(\"div\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"gatsby-highlight\",\n    \"data-language\": \"bash\"\n  }), mdx(\"pre\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"language-bash\"\n  }), mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token comment\"\n  }), \"# Note the --compress-debug-sections option\"), \"\\nobjcopy --only-keep-debug --compress-debug-sections\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token operator\"\n  }), \"=\"), \"zlib binary binary.debug\")))))), mdx(\"p\", null, \"This can be verified by checking for the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"C\"), \" flag in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"readelf\"), \", corresponding to\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"SHF_COMPRESSED\"), \":\"), mdx(\"div\", {\n    \"className\": \"code-tabs-wrapper\"\n  }, mdx(CodeTabs, {\n    mdxType: \"CodeTabs\"\n  }, mdx(CodeBlock, {\n    language: \"bash\",\n    title: \"\",\n    filename: \"\",\n    mdxType: \"CodeBlock\"\n  }, mdx(\"div\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"gatsby-highlight\",\n    \"data-language\": \"bash\"\n  }), mdx(\"pre\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"language-bash\"\n  }), mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"readelf -S path/to/file\\n  \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"..\"), \".\\n  \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"[\"), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token number\"\n  }), \"21\"), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"]\"), \" .debug_info       PROGBITS         0000000000000000  00000370\\n       000000000000e133  0000000000000000   C       \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token number\"\n  }), \"0\"), \"     \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token number\"\n  }), \"0\"), \"     \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token number\"\n  }), \"1\"))))))), mdx(\"h3\", {\n    \"id\": \"pe-and-pdb\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#pe-and-pdb\",\n    \"aria-label\": \"pe and pdb permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"PE and PDB\"), mdx(\"p\", null, \"On Microsoft Windows, executables and dynamic libraries use the \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Portable\\nExecutable\"), \" container, in short \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"PE\"), \". Debug information is stored in \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Program\\nDatabase\"), \" files, commonly referred to as \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"PDB\"), \".\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Executables\"), \" use an \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".exe\"), \" file extension. Only when compiled for 64-bit\\narchitectures, they contain unwind information. Otherwise, they do not contain\\nany usable information and will be omitted for the upload to Sentry.\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Dynamic Libraries\"), \" use the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".dll\"), \" file extension, and otherwise behave\\nexactly the same as executables.\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Debug Companions\"), \" are stored in \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".pdb\"), \" files. They usually contain debug\\ninformation and in most cases symbol tables. For 32-bit programs, they also\\ncontain unwind information. In rare cases, they might have different file\\nnames than their corresponding executable.\"))), mdx(Note, {\n    mdxType: \"Note\"\n  }, mdx(\"markdown\", null, mdx(\"p\", null, \"At the moment, Sentry supports Native PDBs only. PDBs for the .NET platform are not supported.\"))), mdx(\"h3\", {\n    \"id\": \"breakpad-symbols\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#breakpad-symbols\",\n    \"aria-label\": \"breakpad symbols permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Breakpad Symbols\"), mdx(\"p\", null, \"The Google Breakpad library has established a platform-independent ASCII format\\nto store debug information. Such files are usually generated for applications\\nusing Breakpad, Crashpad or the Electron Framework.\"), mdx(\"p\", null, \"The Breakpad repository includes \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"dump_syms\"), \" tools for each platform that can\\nconvert from native debug files to Breakpad symbols. These converters bundle all\\navailable information into one file, such that only one file needs to be\\nuploaded.\"), mdx(\"p\", null, \"In contrast to native debug files, Breakpad symbols discard a lot of information\\nthat is not required to process minidumps. Most notably, inline functions are\\nnot declared, such that Sentry is not able to display inline frames in stack\\ntraces.\"), mdx(\"h3\", {\n    \"id\": \"proguard-mappings\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#proguard-mappings\",\n    \"aria-label\": \"proguard mappings permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"ProGuard Mappings\"), mdx(\"p\", null, \"ProGuard mapping files allow Sentry to resolve obfuscated Java classpaths and\\nmethod names into their original form. In that sense, they act as debug\\ninformation files for Java and Android applications.\"), mdx(\"h2\", {\n    \"id\": \"debug-identifiers\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#debug-identifiers\",\n    \"aria-label\": \"debug identifiers permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Debug Identifiers\"), mdx(\"p\", null, \"Each debug information file specifies a unique identifier. Crash reports declare\\nthese identifiers to allow debuggers and crash reporting systems to resolve the\\ncorrect files. Sentry distinguishes two kinds of identifiers:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Code Identifier\"), \": The unique identifier of the executable or dynamic\\nlibrary -- the code file. The contents of this identifier are\\nplatform-dependent: MachO files use a UUID, ELF files a SHA hash, PE files use\\na concatenation of certain header attributes.\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Debug Identifier\"), \": The unique identifier of the debug companion file. In\\ncontrast to the code identifier, Sentry enforces the same structure on all\\nplatforms. On Windows, this is the actual unique id of the PDB file; on all\\nother platforms this is a lossy transformation of the code identifier.\"))), mdx(\"p\", null, \"When uploading debug information files to Sentry, the CLI and server will always\\ncompute a \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Debug Identifier\"), \" for each uploaded file. This identifier is\\nassociated with executables and libraries as well as debug companions to ensure\\nthat they can be uniquely located via one common mechanism.\"), mdx(Note, {\n    mdxType: \"Note\"\n  }, mdx(\"markdown\", null, mdx(\"p\", null, \"Debug information does not have to be associated with releases. The unique debug\"))), \"identifier ensures that Sentry can choose the right files for every crash report. However, it is still recommended to configure releases in the client to benefit from other features.\", mdx(\"p\", null, \"For native events, the issue details page displays a list of \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Loaded Images\"), \".\\nThis list contains the executable and all loaded dynamic libraries including\\ntheir debug identifiers. You can copy this identifier and search for the exact\\nfiles that match it in the \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Debug Files\"), \" settings screen.\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sentry-cli\"), \" can help to print properties of debug information files like their\\ndebug identifier. See \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"/product/cli/dif/#checking-files\"\n  }), mdx(\"em\", {\n    parentName: \"a\"\n  }, \"Checking Debug Information Files\")), \" for more information.\"), mdx(\"h3\", {\n    \"id\": \"gnu-build-identifiers\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#gnu-build-identifiers\",\n    \"aria-label\": \"gnu build identifiers permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"GNU Build Identifiers\"), mdx(\"p\", null, \"For ELF files on Linux, Sentry uses the GNU build identifier to compute the\\ndebug identifier. All recent compilers and linkers support the emission of build\\nIDs, but sometimes they might require additional configuration. \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"gcc\"), \" does this\\nby default, for \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"clang\"), \" use one of the following flags:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"--build-id=uuid\"), \" for a fast but non-reproducible random identifier.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"--build-id=sha1\"), \" for a slower but reproducible identifier generated by\\nhashing the first page of the code section.\")), mdx(\"p\", null, mdx(\"em\", {\n    parentName: \"p\"\n  }, \"The identifier needs to be present and identical in the binary as well\\nas stripped debug information files.\"), \" If the ID is missing for some reason,\\nupload the files before stripping so that \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sentry-cli\"), \" can compute a stable\\nidentifier from the unstripped file.\"), mdx(\"h3\", {\n    \"id\": \"pdb-age-mismatches\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#pdb-age-mismatches\",\n    \"aria-label\": \"pdb age mismatches permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"PDB Age Mismatches\"), mdx(\"p\", null, \"Microsoft PDBs compose their identifiers from two parts: A unique signature and\\nan age field. The signature is generated when the PDB is written initially and\\nusually changes with every build. The age is a counter that is incremented every\\ntime the PDB is modified.\"), mdx(\"p\", null, \"PE files, such as executables and dynamic libraries, specify the full identifier\\nof the corresponding PDB in their header. This includes the age. If the PDB is\\nmodified after the PE has been generated, however, its age might diverge. This\\ncan lead to different identifiers:\"), mdx(\"div\", {\n    \"className\": \"code-tabs-wrapper\"\n  }, mdx(CodeTabs, {\n    mdxType: \"CodeTabs\"\n  }, mdx(CodeBlock, {\n    language: \"\",\n    title: \"\",\n    filename: \"\",\n    mdxType: \"CodeBlock\"\n  }, mdx(\"div\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"gatsby-highlight\",\n    \"data-language\": \"text\"\n  }), mdx(\"pre\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"language-text\"\n  }), mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"PE:  3003763b-afcb-4a97-aae3-28de8f188d7c-2\\nPDB: 3003763b-afcb-4a97-aae3-28de8f188d7c-4\")))))), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sentry-cli\"), \" can detect these differences during the upload process and\\nassociates the same identifier to both files. However, this requires that both\\nfiles are uploaded in the same invocation of the upload command. Otherwise, the\\nidentifiers diverge and Sentry might not be able to resolve the correct file\\nfor symbolication.\"), mdx(\"h3\", {\n    \"id\": \"proguard-uuids\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#proguard-uuids\",\n    \"aria-label\": \"proguard uuids permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"ProGuard UUIDs\"), mdx(\"p\", null, \"Unlike other debug information files, ProGuard files do not have an intrinsic\\nunique identifier. Sentry CLI assigns them a SHA1 UUID based on the checksum of\\nthe file. You can use \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sentry-cli difutil check\"), \" on a ProGuard file to see the\\ngenerated UUID.\"), mdx(\"p\", null, \"If you need to generate the UUID yourself, you can do so with the following\\nalgorithm (Python code for reference):\"), mdx(\"div\", {\n    \"className\": \"code-tabs-wrapper\"\n  }, mdx(CodeTabs, {\n    mdxType: \"CodeTabs\"\n  }, mdx(CodeBlock, {\n    language: \"python\",\n    title: \"\",\n    filename: \"\",\n    mdxType: \"CodeBlock\"\n  }, mdx(\"div\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"gatsby-highlight\",\n    \"data-language\": \"python\"\n  }), mdx(\"pre\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"language-python\"\n  }), mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-python\"\n  }), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token keyword\"\n  }), \"import\"), \" uuid\\n\\nNAMESPACE \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token operator\"\n  }), \"=\"), \" uuid\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \".\"), \"uuid5\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"(\"), \"uuid\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \".\"), \"NAMESPACE_DNS\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \",\"), \" \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token string\"\n  }), \"\\\"guardsquare.com\\\"\"), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \")\"), \"\\n\\n\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token keyword\"\n  }), \"def\"), \" \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token function\"\n  }), \"get_proguard_uuid\"), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"(\"), \"filename\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \")\"), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \":\"), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token keyword\"\n  }), \"with\"), \" \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token builtin\"\n  }), \"open\"), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"(\"), \"filename\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \",\"), \" \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token string\"\n  }), \"'rb'\"), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \")\"), \" \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token keyword\"\n  }), \"as\"), \" f\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \":\"), \"\\n        \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token keyword\"\n  }), \"return\"), \" uuid\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \".\"), \"uuid5\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"(\"), \"NAMESPACE\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \",\"), \" f\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \".\"), \"read\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"(\"), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \")\"), mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \")\"))))))), mdx(\"h2\", {\n    \"id\": \"uploading-files\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#uploading-files\",\n    \"aria-label\": \"uploading files permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Uploading Files\"), mdx(\"p\", null, \"The most straightforward way to provide Sentry with debug information file is\\nto upload them using \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sentry-cli\"), \". Depending on your workflow, you may want to\\nupload as part of your build pipeline or when deploying and publishing your\\napplication:\"), mdx(\"p\", null, mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1007px\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/d855727a7eef7829c64bd20a594080d7/54bf4/debug-files-workflow.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"36%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsSAAALEgHS3X78AAABdElEQVQY0z1P3UvCUBzdH9tLUdAf0EsvPUkGBtFDUGBSPUQfghVBaWpYhEnqEmc5Pzbd5v3adue2e3e7CXU4Dz8458c5R2k3NYTcmQ1d12eCx5yFjIVChDETSSKE4JxDSDAmEGLJMIzEH5TCdUlqlgWM/lSraIPmxP6o2/kcHuhGe9p//sIWAYBMDEcSI1fS7lrfld5ENZX72ypjiU/no675ea9qL0O9UjZP9p1OZ9Sc9Ks9YMKZA23HdWmEvDlEntkytGJ31Bgpet+gdE6wBxGRLWPOY8ajxcE484Mg8KjnRXarYR2m0MUB98lv48UipVx8C4IQAOw4mMmpLKaU0UAQd44B8ZDvYV8auY/D96dEqwvZMxEJTySUs9zNfub06vxhqJnqXbtT0sG4RvQDa6wiHMgI6gebG3vLS1vra+nVldRwMF0EL5LvCpX85eNrrQltolW7esPEloqHeReNOf81RVGcPcrvpLK76Vxm+9i2wP/zD5+NdlWw49+qAAAAAElFTkSuQmCC')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"debug files workflow\",\n    \"title\": \"debug files workflow\",\n    \"src\": \"/static/d855727a7eef7829c64bd20a594080d7/54bf4/debug-files-workflow.png\",\n    \"srcSet\": [\"/static/d855727a7eef7829c64bd20a594080d7/5a46d/debug-files-workflow.png 300w\", \"/static/d855727a7eef7829c64bd20a594080d7/0a47e/debug-files-workflow.png 600w\", \"/static/d855727a7eef7829c64bd20a594080d7/54bf4/debug-files-workflow.png 1007w\"],\n    \"sizes\": \"(max-width: 1007px) 100vw, 1007px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"p\", null, \"Files can be uploaded using the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"upload-dif\"), \" command. This command will scan a\\ngiven folder recursively for files and upload them to Sentry:\"), mdx(\"div\", {\n    \"className\": \"code-tabs-wrapper\"\n  }, mdx(CodeTabs, {\n    mdxType: \"CodeTabs\"\n  }, mdx(CodeBlock, {\n    language: \"bash\",\n    title: \"\",\n    filename: \"\",\n    mdxType: \"CodeBlock\"\n  }, mdx(\"div\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"gatsby-highlight\",\n    \"data-language\": \"bash\"\n  }), mdx(\"pre\", _extends({\n    parentName: \"div\"\n  }, {\n    \"className\": \"language-bash\"\n  }), mdx(\"code\", _extends({\n    parentName: \"pre\"\n  }, {\n    \"className\": \"language-bash\"\n  }), \"sentry-cli upload-dif -o \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token operator\"\n  }), \"<\"), \"org\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token operator\"\n  }), \">\"), \" -p \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token operator\"\n  }), \"<\"), \"project\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token operator\"\n  }), \">\"), \" /path/to/files\\n\\n\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token operator\"\n  }), \">\"), \" Found \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token number\"\n  }), \"2\"), \" debug information files\\n\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token operator\"\n  }), \">\"), \" Prepared debug information files \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token keyword\"\n  }), \"for\"), \" upload\\n\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token operator\"\n  }), \">\"), \" Uploaded \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token number\"\n  }), \"2\"), \" missing debug information files\\n\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token operator\"\n  }), \">\"), \" File processing complete:\\n\\n  PENDING 1ddb3423-950a-3646-b17b-d4360e6acfc9 \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"(\"), \"MyApp\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \";\"), \" x86_64 executable\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \")\"), \"\\n  PENDING 1ddb3423-950a-3646-b17b-d4360e6acfc9 \", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \"(\"), \"MyApp\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \";\"), \" x86_64 debug companion\", mdx(\"span\", _extends({\n    parentName: \"code\"\n  }, {\n    \"className\": \"token punctuation\"\n  }), \")\"))))))), mdx(\"p\", null, \"For all available options and more information refer to \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"/product/cli/dif/#uploading-files\"\n  }), mdx(\"em\", {\n    parentName: \"a\"\n  }, \"Uploading Debug\\nInformation\")), \".\"), mdx(\"p\", null, \"Always ensure that debug files are uploaded before deploying or releasing your\\napplication so that crash reports can be processed. For manual testing, use the\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sentry-cli upload-dif --wait\"), \" before sending the first native crash or error\\nevent.\"), mdx(\"p\", null, \"If you upload a file that was previously reported as missing by Sentry in a crash\\nreport, it may take up to one hour until Sentry starts using this file for new\\ncrash reports. Existing events and issues are not processed again.\"), mdx(\"p\", null, \"In Sentry, your uploaded files are associated with projects. You can view and\\nmanage uploads at \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Project Settings > Debug Files\"), \". This screen displays the\\nmost important properties of debug files:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"The debug identifier. There may be multiple entries sharing the same\\nidentifier, if debug information is split across multiple files.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"The name of the debug file. Sentry uses the name on the file system when\\nuploading the file using \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"sentry-cli\"), \".\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"The architecture, and type of the file. This can be used to distinguish files\\ninto executables and debug companions if their debug identifiers and names\\nmatch.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"The debug information available in these files. This can include \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"unwind\"), \",\\n\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"debug\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"symtab\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"sources\"), \".\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Metadata like the size and time of upload.\")), mdx(\"p\", null, \"If multiple projects require the same file, it needs to be re-uploaded. Sentry\\ndoes not access debug files stored in other projects to symbolicate crash\\nreports.\"), mdx(\"h2\", {\n    \"id\": \"reprocessing\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#reprocessing\",\n    \"aria-label\": \"reprocessing permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Reprocessing\"), mdx(\"p\", null, \"Sentry can suspend incoming crash reports until all required debug information\\nfiles have been uploaded. This feature is called \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Reprocessing\"), \". It can be\\nconfigured in \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Project Settings > Processing Issues\"), \". By default, this feature\\nis disabled.\"), mdx(\"p\", null, \"If enabled, crash reports with missing debug files will not be displayed in the\\nissues stream. Instead, you will receive a warning that events cannot be\\nprocessed until all debug files have been uploaded.\"), mdx(\"p\", null, \"Once an issue is shown in the issues stream, it is no longer processed. Even\\nwith enabled reprocessing, new file uploads will not effect such events.\"), mdx(\"p\", null, \"At the moment, this feature only applies to iOS crashes sent with the Cocoa SDK\\nand is not compatible with Symbol Servers.\"), mdx(\"h2\", {\n    \"id\": \"symbol-servers\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#symbol-servers\",\n    \"aria-label\": \"symbol servers permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Symbol Servers\"), mdx(\"p\", null, \"Sentry can download debug information files from external repositories. This\\nallows you to stop uploading debug files and instead configure a public symbol\\nserver or run your own. It is also possible to configure external repositories\\nand upload debug files at the same time.\"), mdx(\"p\", null, \"To configure external repositories, go to \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Project Settings > Debug Files\"), \".\\nAbove the list of uploaded files, there are two settings to configure external\\nrepositories:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Custom Repositories:\"), \" Configures custom repositories containing debug\\nfiles. You can choose from configuring an HTTP symbol server, Amazon S3\\nbucket or Google Cloud Storage bucket. This requires a \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Business\"), \" or\\n\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Enterprise\"), \" plan.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Built-In Repositories:\"), \" Allows to select from a list of pre-configured\\nsymbol servers. By default, \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"iOS\"), \" and \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Microsoft\"), \" are enabled.\"))), mdx(\"p\", null, \"Sentry queries external repositories for debug information files in the order\\nthey are configured. If custom repositories are configured, those are probed\\nfirst. Only debug information files that are not found on one of the custom\\nrepositories are queried from the built-in ones.\"), mdx(\"h3\", {\n    \"id\": \"built-in-repositories\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#built-in-repositories\",\n    \"aria-label\": \"built in repositories permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Built-In Repositories\"), mdx(\"p\", null, \"To enable a built-in repository, select it from the dropdown list. This\\nimmediately adds the repository and uses its debug information files to\\nsymbolicate new crash reports. Likewise, any built-in repository can be disabled\\nby clicking on the X next to the name.\"), mdx(\"p\", null, \"Adding or removing external repositories applies immediately. As a result,\\nevents may group differently with the new information and create new issues.\\nBeware that these cause notifications to your team members.\"), mdx(\"h3\", {\n    \"id\": \"custom-repositories\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#custom-repositories\",\n    \"aria-label\": \"custom repositories permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Custom Repositories\"), mdx(Alert, {\n    title: \"Note\",\n    level: \"info\",\n    mdxType: \"Alert\"\n  }, mdx(\"markdown\", null, mdx(\"p\", null, \"Custom repositories are available for organizations on the \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Business\"), \" and\\n\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Enterprise\"), \" plans.\"))), mdx(\"p\", null, \"Independent of the internal format, Sentry supports three kinds of custom\\nrepositories:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"HTTP Symbol Server\"), \": An HTTP server that serves debug files at a\\nconfigurable path. Lookups in the server should generally be case-insensitive,\\nalthough an explicit casing can be configured in the settings.\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Amazon S3 Bucket\"), \": Either an entire S3 bucket or a subdirectory. This\\nrequires \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"s3:GetObject\"), \", and optionally \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"s3:ListBucket\"), \" permissions for the\\nconfigured Access Key. Lookups in the bucket are case sensitive, which is why\\nwe recommend storing all files lower-cased.\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Google Cloud Storage Bucket\"), \": Either an entire GCS bucket or a\\nsubdirectory. This requires \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"storage.objects.get\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"storage.objects.list\"), \"\\npermissions for the configured service account. Lookups in the bucket are case\\nsensitive, which is why we recommend storing all files lower-cased.\"))), mdx(\"p\", null, \"Apart from authentication configuration, all types have common config\\nparameters:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Name\"), \": A name to identify the repository.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Path Casing\"), \": Overrides which casing Sentry uses to query for debug\\ninformation files. The default is a mixed case, which will use the case\\ndescribed in the next section. When overridden, all access is either\\nlowercased or uppercased. Defaults to \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"mixed case\\\"\"), \".\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Directory Layout\"), \": The internal structure of the bucket, or the protocol\\nof the symbol server. There are three layouts to choose from which are\\ndiscussed in the next section. Defaults to \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"\\\"Platform Specific\\\"\"), \".\"))), mdx(\"h3\", {\n    \"id\": \"directory-layouts\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#directory-layouts\",\n    \"aria-label\": \"directory layouts permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Directory Layouts\"), mdx(\"p\", null, \"Sentry supports multiple layouts for external repositories. Based on the\\nselected layout and the file type, we try to download files at specific paths.\"), mdx(\"p\", null, \"The following table contains a mapping from the supported layouts to file path\\nschemas applied for specific files:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Layout\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"MachO\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"ELF\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"PE\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"PDB\"), mdx(\"th\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"Breakpad\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Platform-Specific\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"LLDB\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"BuildID\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"SymStore\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"SymStore\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"Breakpad\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Microsoft SymStore\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"-\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"-\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"SymStore\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"SymStore\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"-\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Microsoft SymStore (index2.txt)\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"-\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"-\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"Index2\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"Index2\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"-\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": null\n  }), \"Microsoft SSQP\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"SSQP\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"SSQP\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"SSQP\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"SSQP\"), mdx(\"td\", _extends({\n    parentName: \"tr\"\n  }, {\n    \"align\": \"center\"\n  }), \"-\")))), mdx(\"p\", null, \"The path schemas in the table above are defined as follows:\"), mdx(\"p\", null, mdx(\"dl\", {\n    parentName: \"p\"\n  }, mdx(\"dt\", {\n    parentName: \"dl\"\n  }, mdx(\"strong\", {\n    parentName: \"dt\"\n  }, \"Breakpad\")), mdx(\"dd\", {\n    parentName: \"dl\"\n  }, \"Path: \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"<DebugName>/<BREAKPADid>/<SymName>\")))), mdx(\"p\", null, \"Breakpad always uses a \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Breakpad ID\"), \" to store symbols. These identifiers can\\nbe computed from \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Debug Identifiers\"), \" by removing dashes and applying the\\nfollowing casing rules:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The signature part of the id (first 32 characters) are \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"uppercase\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The age part of the id (remaining characters) are \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"lowercase\"), \".\")), mdx(\"p\", null, \"The name of the symbol file is platform dependent. On Windows, the file\\nextension (Either \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".exe\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".dll\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".pdb\"), \") is replaced with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".sym\"), \". On all\\nother platforms, the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".sym\"), \" extension is \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"appended\"), \" to the full file name\\nincluding potential extensions.\"), mdx(\"p\", null, \"Examples:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"wkernel32.pdb/FF9F9F7841DB88F0CDEDA9E1E9BFF3B51/wkernel32.sym\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"MyFramework.dylib/5E012A646CC536F19B4DA0564049169B/MyFramework.dylib.sym\"))), mdx(\"p\", null, mdx(\"dl\", {\n    parentName: \"p\"\n  }, mdx(\"dt\", {\n    parentName: \"dl\"\n  }, mdx(\"strong\", {\n    parentName: \"dt\"\n  }, \"LLDB\")), mdx(\"dd\", {\n    parentName: \"dl\"\n  }, \"Path: \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"XXXX/XXXX/XXXX/XXXX/XXXX/XXXXXXXXXXXX[.app]\")))), mdx(\"p\", null, \"The LLDB debugger on macOS can read debug symbols from \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://lldb.llvm.org/use/symbols.html#file-mapped-uuid-directories\"\n  }), \"File Mapped UUID\\nDirectories\"), \".\\nThe UUID is broken up by splitting the first 20 hex digits into 4 character\\nchunks, and a directory is created for each chunk. In the final directory,\\nLLDB usually expects a symlink named by the last 12 hex digits, which it\\nfollows to the actual dSYM file.\"), mdx(\"p\", null, \"This is not actually an LLVM feature. This is in fact a feature of\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"CoreFoundation\"), \" and exclusively implemented on macOS on top of spotlight.\\nSpotlight indexes these paths and the private \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"DBGCopyFullDSYMURLForUUID\"), \" API\\nis used by lldb to locate the symbols. macOS uses the symlinks of those\\nlocations.\"), mdx(\"p\", null, \"Since the executable or library shares the same UUID as the dSYM file, the\\nformer are distinguished with a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".app\"), \" suffix.\"), mdx(\"p\", null, \"The hex digits are \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"uppercase\"), \", the app suffix is \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"lowercase\"), \".\"), mdx(\"p\", null, \"Examples:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"5E01/2A64/6CC5/36F1/9B4D/A0564049169B\"), \" (debug companion)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"5E01/2A64/6CC5/36F1/9B4D/A0564049169B.app\"), \" (executable or library)\")), mdx(\"p\", null, mdx(\"dl\", {\n    parentName: \"p\"\n  }, mdx(\"dt\", {\n    parentName: \"dl\"\n  }, mdx(\"strong\", {\n    parentName: \"dt\"\n  }, \"BuildID\")), mdx(\"dd\", {\n    parentName: \"dl\"\n  }, \"Path: \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"nn/nnnnnnnnnnnnnnnn...[.debug]\")))), mdx(\"p\", null, \"GDB supports multiple lookup methods, depending on the way the debug info file\\nis specified. Sentry uses the \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html\"\n  }), \"Build ID Method\"), \": Assuming that a GNU build ID\\nnote or section has been written to the ELF file, this specifies a unique\\nidentifier for the executable which is also retained in the debug file.\"), mdx(\"p\", null, \"The GNU build ID is a variable-length binary string, usually consisting of a\\n20-byte SHA1 hash of the code section (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".text\"), \"). The lookup path is\\n\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"pp/nnnnnnnn.debug\"), \", where \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"pp\"), \" are the first 2 hex characters of the build ID\\nbit string, and \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"nnnnnnnn\"), \" are the rest of the hex string. To look up\\nexecutables, the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".debug\"), \" suffix is omitted.\"), mdx(\"p\", null, \"Examples:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"b5/381a457906d279073822a5ceb24c4bfef94ddb\"), \" (executable or library)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"b5/381a457906d279073822a5ceb24c4bfef94ddb.debug\"), \" (stripped debug file)\")), mdx(\"p\", null, mdx(\"dl\", {\n    parentName: \"p\"\n  }, mdx(\"dt\", {\n    parentName: \"dl\"\n  }, mdx(\"strong\", {\n    parentName: \"dt\"\n  }, \"SSQP\")), mdx(\"dd\", {\n    parentName: \"dl\"\n  }, \"Path: \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"<file_name>/<prefix>-<identifier>/<file_name>\")))), mdx(\"p\", null, mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://github.com/dotnet/symstore/blob/master/docs/specs/SSQP_Key_Conventions.md\"\n  }), \"SSQP Key Conventions\"), \" are an extension to the original Microsoft Symbol\\nServer protocol for .NET. It specifies lookup paths for PE, PDB, MachO and ELF\\nfiles. The case of all lookup paths is generally \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"lowercase\"), \" except for the\\nage field of PDB identifiers which should be \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"uppercase\"), \".\"), mdx(\"p\", null, \"For MachO files and ELF files, SSQP specifies to use the same identifiers as\\nused in the LLDB and GNU build id method, respectively. See the sections above\\nfor more information. This results in the following paths for all possible\\nfile types:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"<code_name>/<timestamp><size_of_image>/<code_name>\"), \"\\n(PE file)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"<debug_name>/<signature><AGE>/<debug_name>\"), \" (PDB\\nfile)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"<code_name>/elf-buildid-<buildid>/<code_name>\"), \" (ELF\\nbinary)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"_.debug/elf-buildid-sym-<buildid>/_.debug\"), \" (ELF debug file)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"<code_name>/mach-uuid-<uuid>/<code_name>\"), \" (MachO binary)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"_.dwarf/mach-uuid-sym-<uuid>/_.dwarf\"), \" (MachO binary)\")), mdx(\"p\", null, \"SSQP specifies an additional lookup method by SHA1 checksum over the\\nfile contents, commonly used for source file lookups. \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Sentry does not support\\nthis lookup method.\")), mdx(\"p\", null, \"Examples:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"wkernel32.pdb/ff9f9f7841db88f0cdeda9e1e9bff3b5A/wkernel32.pdb\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"kernel32.dll/590285e9e0000/kernel32.dll\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"libc-2.23.so/elf-buildid-b5381a457906d279073822a5ceb24c4bfef94ddb/libc-2.23.so\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"_.debug/elf-buildid-sym-b5381a457906d279073822a5ceb24c4bfef94ddb/_.debug\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"CoreFoundation/mach-uuid-36385a3a60d332dbbf55c6d8931a7aa6/CoreFoundation\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"_.dwarf/mach-uuid-sym-36385a3a60d332dbbf55c6d8931a7aa6/_.dwarf\"))), mdx(\"p\", null, mdx(\"dl\", {\n    parentName: \"p\"\n  }, mdx(\"dt\", {\n    parentName: \"dl\"\n  }, mdx(\"strong\", {\n    parentName: \"dt\"\n  }, \"SymStore\")), mdx(\"dd\", {\n    parentName: \"dl\"\n  }, \"Path: \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"<FileName>/<SIGNATURE><AGE>/<FileName>\")))), mdx(\"p\", null, \"The public symbol server provided by Microsoft used to only host PDBs for the\\nWindows platform. These use a \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"signature-age\"), \" debug identifier in addition to\\nthe file name to locate symbols. File paths are identical to SSQP, except for\\nthe default casing rules:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Filenames are \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"as given\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The signature and age of a PDB identifier are \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"uppercase\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The timestamp of a PE identifier is \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"uppercase\"), \", but the size is\\n\", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"lowercase\"), \".\")), mdx(\"p\", null, \"Since the original Microsoft Symbol Server did not serve ELF or MachO files,\\nwe do not recommend using this convention for these types. However, Sentry\\nwill support the SSQP conventions with adapted casing rules when this layout\\nis selected.\"), mdx(\"p\", null, \"Examples:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"wkernel32.pdb/FF9F9F7841DB88F0CDEDA9E1E9BFF3B5A/wkernel32.pdb\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"KERNEL32.dll/590285E9e0000/KERNEL32.dll\"))), mdx(\"p\", null, mdx(\"dl\", {\n    parentName: \"p\"\n  }, mdx(\"dt\", {\n    parentName: \"dl\"\n  }, mdx(\"strong\", {\n    parentName: \"dt\"\n  }, \"Index2\")), mdx(\"dd\", {\n    parentName: \"dl\"\n  }, \"Path: \", mdx(\"inlineCode\", {\n    parentName: \"dd\"\n  }, \"<Fi>/<FileName>/<SIGNATURE><AGE>/<FileName>\")))), mdx(\"p\", null, \"This layout is identical to \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"SymStore\"), \", except that the first two characters\\nof the file name are prepended to the path as an additional folder.\"), mdx(\"p\", null, \"Examples:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"wk/wkernel32.pdb/FF9F9F7841DB88F0CDEDA9E1E9BFF3B5A/wkernel32.pdb\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"KE/KERNEL32.dll/590285E9e0000/KERNEL32.dll\"))), mdx(\"h3\", {\n    \"id\": \"compression-of-debug-files\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#compression-of-debug-files\",\n    \"aria-label\": \"compression of debug files permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Compression of Debug Files\"), mdx(\"p\", null, \"Sentry supports the following compression methods when downloading debug\\ninformation files from external sources: Gzip, zlib (both with and\\nwithout header), Zstandard, and Cabinet (CAB).\"), mdx(\"p\", null, \"The convention on Microsoft's Symbol Server protocol is to store such files with\\nthe last character of the file extension replaced with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"_\"), \". A full example would\\nbe: \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"KERNEL32.dll/590285E9e0000/KERNEL32.dl_\"), \". This is not required on your own\\nrepositories, as Sentry detects compression on all paths.\"), mdx(\"h2\", {\n    \"id\": \"source-context\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#source-context\",\n    \"aria-label\": \"source context permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Source Context\"), mdx(\"p\", null, \"If Sentry has access to application source code, it can show snippets of code\\naround the location of stack frames. Certain SDKs can resolve this source\\ncontext automatically, such as the Python SDK, because they have access to\\nunobfuscated source code at runtime.\"), mdx(\"p\", null, \"To get source context for native applications, source code needs to be uploaded\\nalongside the debug information files. The recommended way to do this is by\\nusing \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sentry-cli\"), \". See \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"/product/cli/dif/#creating-source-bundles\"\n  }), \"Creating Source Bundles\"), \" for more information.\"), mdx(\"p\", null, \"Source bundles show up as regular debug files on the \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Debug Files\"), \" settings\\npage. They are designated as \\\"source bundle\\\" and feature a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"sources\"), \" tag. To\\nmatch them with crash reports, they carry the same debug file as the respective\\ndebug information file they have been created from.\"));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#debug-information","title":"Debug Information","items":[{"url":"#macho-and-dsym","title":"MachO and dSYM"},{"url":"#executable-and-linkable-format-elf","title":"Executable and Linkable Format (ELF)"},{"url":"#pe-and-pdb","title":"PE and PDB"},{"url":"#breakpad-symbols","title":"Breakpad Symbols"},{"url":"#proguard-mappings","title":"ProGuard Mappings"}]},{"url":"#debug-identifiers","title":"Debug Identifiers","items":[{"url":"#gnu-build-identifiers","title":"GNU Build Identifiers"},{"url":"#pdb-age-mismatches","title":"PDB Age Mismatches"},{"url":"#proguard-uuids","title":"ProGuard UUIDs"}]},{"url":"#uploading-files","title":"Uploading Files"},{"url":"#reprocessing","title":"Reprocessing"},{"url":"#symbol-servers","title":"Symbol Servers","items":[{"url":"#built-in-repositories","title":"Built-In Repositories"},{"url":"#custom-repositories","title":"Custom Repositories"},{"url":"#directory-layouts","title":"Directory Layouts"},{"url":"#compression-of-debug-files","title":"Compression of Debug Files"}]},{"url":"#source-context","title":"Source Context"}]},"internal":{"type":"Mdx"}}}},"pageContext":{"excerpt":"Debug information files allow Sentry to extract stack traces and provide more\ninformation about crash reports for most compiled platforms. Information stored\nin debug files includes original function names, paths to source files and line\nnumbers, source code context, or the placement of variables in memory. Sentry\ncan use some of this information and display it on the issue details page. Each major platform uses different debug information files. We currently support\nthe following formats: dSYM files  for iOS, iPadOS,\ntvOS, watchOS, and macOS ELF symbols  for Linux and\nAndroid (NDK) PDB files  for Windows Breakpad symbols  for all\nplatforms ProGuard mappings  for\nJava and Android Source maps, while also being debug information files, are handled\nin Sentry. For more information see  Source Maps in sentry-cli . differently Sentry requires access to debug information files of your application as well as\nsystem libraries to provide fully symbolicated crash reports. You can either\n upload  your files to Sentry or put them on a compatible\n Symbol Server  to be downloaded by Sentry when needed. Debug information files can be managed on the  Debug Files  section in  Project\nSettings . This page lists all uploaded files and allows to configure symbol\nservers for automatic downloads. Debug Information Sentry differentiates in four kinds of debug information: Unwind Information:  Enables Sentry to extract stack traces from Minidumps\nand other binary crash formats of optimized builds. This process is referred\nto as \"stack unwinding\" or \"stack walking\". Since this is also required when\nthrowing exceptions in C++, this information is often included in the\nexecutable or library. If an uploaded file contains this information, it shows\nthe  unwind  tag. Debug Information:  Provides function names, paths to source files, line\nnumbers and inline frames. The process of resolving this information from\ninstruction addresses is called \"symbolication\". This information is\nrelatively large compared to the executable and usually put into a separate\nfile. In Sentry, these files are designated as  debug companions  and show the\n debug  tag. Symbol Tables:  If debug information is not available for a certain\nlibrary, Sentry can use symbol tables as a fallback to retrieve function\nnames. Symbol tables are usually included in both the executable and debug\ncompanion files. However, they do not contain sufficient information to\nresolve inline functions or file names and line numbers. The  symtab  tag\nindicates symbol tables. Source Code:  Conventionally, source code is not part of regular debug\ninformation files. Sentry CLI can bundle source code of your application and\nupload it to display source context in stack traces in Sentry. These bundles\nshow up with the  sources  tag. Compilers place the above debug information in different files passed on the\ntarget platform, architecture, build flags or optimization level. Consequently,\nSentry might not need all of the above information to process crash reports.\nStill, it is always a good idea to provide all available debug information. sentry-cli  can be used to list properties of supported debug files and\nvalidate their contents. See  Debug Information Files in sentry-cli  for more information. The remainder of this section describes the file formats in detail. MachO and dSYM Executables, dynamic libraries and debug companions on all Apple platforms use\nthe  Mach Object , or short  MachO , container format. This applies to iOS,\niPadOS, tvOS, watchOS, and macOS. Executables  do not carry a file extension. For desktop applications, they\nare often placed in app bundle structures with the  .app  suffix. Unless\nstripped manually, executables contain unwind information and a symbol table.\nDebug information is never stored in executables. Dynamic Libraries  use the  .dylib  extension, and otherwise behave exactly\nthe same as executables. Debug Companions  are placed in a folder structure with the  .dSYM \nextension, and are located at  <name>.dSYM/Contents/Resources/DWARF/<name> .\nThey usually contain a symbol table and debug information, but rarely unwind\ninformation. When building an application with Xcode or with the  clang  compiler, debug\ninformation is automatically placed in a dSYM file. When linking manually,\nhowever, the dSYM file must be created using the following command: Executable and Linkable Format (ELF) On Linux distributions, executables and debug information are stored in  ELF \ncontainers. Unlike other platforms, there is no dedicated container or specifier\nfor debug companion files. Debug information is part of the binary (executable or library) and stripped\nwhen generating release builds due to their size. However, there is a way to\nretain them in a separate file (either in a different location or with  .debug \nextension): This results in the following structure: Executables  do not carry a file extension. If stripped like above,\nexecutables contain a symbol table, but no debug…","title":"Debug Information Files","sidebar_order":7,"redirect_from":[],"supported":["native","android","cocoa"],"platform":{"name":"native","title":"Native"},"guide":{"name":"crashpad","title":"Google Crashpad"},"noindex":true,"notoc":true,"id":"6dabc27b-9cba-554b-b2a9-ea1feb87bd8c"}},"staticQueryHashes":["1218203755","1222113826","1222113826","1766336459","2158593473","2404336828","2472290386","2764967025","3818502851","4015007367","4192517163","4264099332","518019976"]}