Using The Mozilla Source Server

The Mozilla Source Server allows debuggers to automatically fetch the exact source files that correspond to a Firefox build you’re debugging on Windows. This is particularly useful when debugging crash dumps, Nightly builds, or Release builds where you don’t have the matching source code locally. Without the source server, you would need to either build Firefox yourself or to point your debugger to a local checkout at the exact source revision matching the binary you’re debugging.

The Mozilla Source Server works by embedding a SrcSrv stream into PDB files served by the Mozilla Symbol Server. This stream contains instructions that tell your debugger where to fetch source files from Mozilla’s HTTP servers. When you step into code during debugging, or when you click an entry of the call stack in a crash dump, your debugger automatically downloads the corresponding source file and displays it. This also works when debugging a try build once you have uploaded its symbols to the Mozilla Symbol Server (see Uploading symbols for a try build).

Within the source tree, the script that adds the SrcSrv stream to PDB files is toolkit/crashreporter/tools/symbolstore.py, called from the ./mach buildsymbols command (see Building with Debug Symbols for details on this command).

SrcSrv version 1 relied on executing arbitrary commands derived from the PDB file’s SrcSrv stream. This is not desirable security-wise and is no longer supported by debuggers in their default configurations. SrcSrv version 2 later added a safe URL-based source fetching feature that debuggers support out of the box. Mozilla’s PDBs exclusively rely on the safe URL-based fetching feature added by SrcSrv version 2.

Windows Debuggers Setup

Visual Studio

Fetching source code should mostly work once the symbol server is correctly setup. If needed, you will find the options that interact with the Source Server feature under Tools, Options, Debugging, General:

  • Enable Source Link support: this option is enabled by default and should be enough to get things working with Mozilla’s PDB files.

  • Enable source server support: this option is disabled by default and controls legacy SrcSrv support, which should not be required.

WinDbg

The first step here is also to make sure that the symbol server is correctly setup. Then, unfortunately, SrcSrv support is broken in WinDbg starting with app version 1.2402.24001.0 (see Known Issues for workaround suggestions).

If you need extra logs from WinDbg when it loads source files, consider using:

!sym noisy
.srcnoisy 3

Historically, SrcSrv support in WinDbg required adding SRV* to your source path. To the best of our knowledge, this isn’t required at all anymore, but you can still check your current source path with:

.srcpath

And set your source path to SRV* with:

.srcfix

Known Issues

There currently are a few known issues with source server support in Microsoft debuggers:

WinDbg app versions 1.2402.24001.0+ cannot load source files (Bug 2006283)

Recent versions of the WinDbg app starting with version 1.2402.24001.0 have a regression that prevents source files from being loaded from Mozilla PDBs. This issue has been reported to Microsoft. Older versions (1.2308.2002.0 and below) and WinDbg Classic are not affected.

The workaround for the gzip issue described below works around both issues at the same time. Otherwise, a simpler workaround (that will run into the gzip issue) is to install the most recent version known to be compatible. From a Powershell window, run:

winget uninstall Microsoft.WinDbg
winget install Microsoft.WinDbg --version 1.2308.2002.0

Generated source files display as garbled/gzipped data (Bug 2006338)

Build-generated source files (such as IPDL-generated files) are hosted on Amazon S3 with gzip compression. Microsoft debuggers (Visual Studio and WinDbg) do not expect compression when fetching these files, resulting in garbled output or refusal to display the file contents.

Regular (non-generated) source files from Mercurial and GitHub repositories are not affected by this issue. A possible workaround is to configure your debugger to use curl.exe with the --compressed flag to retrieve source files. See example 2 in Advanced Usage: Customizing Source Retrieval for full details.

Advanced Usage: Customizing Source Retrieval

You can customize how debuggers fetch source files by creating a srcsrv.ini configuration file somewhere on your disk and pointing the SRCSRV_INI_FILE environment variable to it. This should at least work in WinDbg.

At the time of writing this documentation, all our attempts to get Visual Studio to load a custom srcsrv.ini have failed. This might be a regression on Microsoft’s side. Please update this documentation if you get this working with Visual Studio.

The variable definitions in srcsrv.ini will take precedence over those in every loaded PDB file’s SrcSrv stream, allowing you to redirect source file URLs or to change how files are fetched. This is very powerful, though it requires understanding how SrcSrv streams work. Refer to the Microsoft documentation for SrcSrv version 1 for more details. Version 2 is a simple extension that says that if the variable SRCSRVCMD is empty or absent, then the variable SRCSRVTRG should be interpreted as a URL from which to retrieve the source file.

Example 1: Redirecting GitHub repository URLs

Suppose that at some point in the future, Firefox’s GitHub repository moves. We then want to debug an old Firefox build, but the PDB files point to the old repository and there is no automatic redirection, so debuggers are unable to find the source files. By looking at the SrcSrv stream for one of the old PDB files we would see that the variable that specifies the GitHub repository was defined as:

FIREFOX_GITHUB_TARGET=https://github.com/mozilla-firefox/firefox/raw/%var4%/%var3%

We can just override this variable in our local srcsrv.ini to solve our problem, without having to alter any PDB file. The following would work:

[variables]
FIREFOX_GITHUB_TARGET=https://github.com/new-mozilla-org/new-firefox-repo/raw/%var4%/%var3%

This overrides the FIREFOX_GITHUB_TARGET variable in all PDB files’ SrcSrv streams, redirecting all GitHub source file requests to the new repository location while preserving the revision (%var4%) and file path (%var3%) defined by the original indexing.

Example 2: Working around the gzip compression issue

As described in the known issues section, generated source files served from S3 are gzip-compressed and unlikely to display correctly in Microsoft debuggers. This is something that we can work around, by forcing the debugger to use curl.exe with the --compressed flag:

[variables]
SRCSRVTRG=%targ%\mozilla-src\%var2%\%var4%\%fnbksl%(%var3%)
SRCSRVCMD=curl.exe --location --compressed --output %srcsrvtrg% --silent %fnvar%(%var2%)

The SRCSRVTRG variable defines where downloaded files will be cached locally, and the SRCSRVCMD variable specifies the command to fetch files. The --compressed flag ensures curl properly handles gzip-encoded responses.

Because this solution relies on command execution and not just on the URL fetching feature provided by SrcSrv version 2, your debugger will prompt you for a manual validation of every command that it will run. While there exist ways to avoid this prompting, we recommend that you stick to manual validation for security reasons.

A generated command that is valid and safe would look as follows:

curl.exe --location --compressed --output C:\ProgramData\Dbg\mozilla-src\HG_TARGET\86bb7f6af6312ba3c0161085f854bcdff68f1a91\browser\app\nsBrowserApp.cpp --silent https://hg.mozilla.org/releases/mozilla-release/raw-file/86bb7f6af6312ba3c0161085f854bcdff68f1a91/browser/app/nsBrowserApp.cpp

Debugging Source Server Issues

If you encounter problems with source file loading, you can inspect the SrcSrv stream embedded in a PDB file to try to diagnose the issue.

Getting the path to the PDB

PDB files are usually stored in your symbol cache after you debugger downloads them. By default with WinDbg, this means C:\ProgramData\Dbg\sym.

For example, say we want to double-check mozglue. We can use the lm command and click on the module name to get the full PDB path.

0:000> lm
start             end                 module name
[...]
00007ffb`181c0000 00007ffb`18291000   mozglue    (deferred)
[...]

By clicking on mozglue, we get:

0:000> lmDvmmozglue
start             end                 module name
00007ffb`181c0000 00007ffb`18291000   mozglue    (deferred)
    Mapped memory image file: C:\ProgramData\Dbg\sym\mozglue.dll\695C3716d1000\mozglue.dll
    Image path: C:\Program Files\Mozilla Firefox\mozglue.dll
    Image name: mozglue.dll
    [...]

This isn’t good, because mozglue is marked as deferred: the symbols for this specific DLL have not yet been loaded by the debugger. We can force the load to occur now with:

0:000> .reload /f mozglue.dll
*** WARNING: Unable to verify checksum for mozglue.dll

And by re-issueing the previous command, we now get the local path to our PDB file:

0:000> lmDvmmozglue
start             end                 module name
00007ffb`181c0000 00007ffb`18291000   mozglue  C (private pdb symbols)  C:\ProgramData\Dbg\sym\mozglue.pdb\D38D21E32E5E8ACD4C4C44205044422E1\mozglue.pdb
    Loaded symbol image file: mozglue.dll
    Mapped memory image file: C:\ProgramData\Dbg\sym\mozglue.dll\695C3716d1000\mozglue.dll
    Image path: C:\Program Files\Mozilla Firefox\mozglue.dll
    Image name: mozglue.dll
    [...]

Viewing the SrcSrv stream

You can extract and view the SrcSrv stream from a PDB file using the pdbstr tool, which is part of Debugging Tools For Windows within the Windows SDK. This tool is typically located at C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\srcsrv\pdbstr.exe.

To extract the stream, run:

pdbstr -r -p:path\to\file.pdb -s:srcsrv

This will display the source indexing information that tells debuggers where to fetch each source file.

Checking for unindexed files

You can list files that are not indexed in the SrcSrv stream using the srctool utility, also part of Debugging Tools For Windows:

srctool.exe -u path\to\file.pdb

Ideally, all source files referenced by a PDB should be indexed. Debuggers can only automatically load source files that are indexed in the SrcSrv stream. If a file is not indexed, the debugger will be unable to fetch it automatically.

Reporting issues

If you can’t get your debugger to load some source files and your case isn’t covered by the known issues listed above, please file a bug in Bugzilla under the Toolkit :: Crash Reporting component.