diff --git a/docs/README.md b/docs/README.md
index d22ef38e7238..ed7d803b72da 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -56,3 +56,4 @@ Modules for both sides:
* [Build instructions (Mac)](development/build-instructions-mac.md)
* [Build instructions (Windows)](development/build-instructions-windows.md)
* [Build instructions (Linux)](development/build-instructions-linux.md)
+* [Setting up symbol server in debugger](development/setting-up-symbol-server.md)
diff --git a/docs/development/setting-up-symbol-server.md b/docs/development/setting-up-symbol-server.md
new file mode 100644
index 000000000000..b69c0df02827
--- /dev/null
+++ b/docs/development/setting-up-symbol-server.md
@@ -0,0 +1,56 @@
+# Setting up symbol server in debugger
+
+Debug symbols allow you to have better debugging sessions. They have information
+about the functions contained in executables and dynamic libraries and provide
+you with information to get clean call stacks. A Symbol Server allows the
+debugger to load the correct symbols, binaries and sources automatically without
+forcing users to download large debugging files. The server functions like
+[Microsoft's symbol server](http://support.microsoft.com/kb/311503) so the
+documentation there can be useful.
+
+Note that because released atom-shell builds are heavily optimized, debugging is
+not always easy. The debugger will not be able to show you the content of all
+variables and the execution path can seem strange because of inlining, tail
+calls, and other compiler optimizations. The only workaround is to build an
+unoptimized local build.
+
+The official symbol server URL for atom-shell is
+http://54.249.141.255:8086/atom-shell/symbols.
+You cannot visit this URL directly: you must add it to the symbol path of your
+debugging tool. In the examples below, a local cache directory is used to avoid
+repeatedly fetching the PDB from the server. Replace `c:\code\symbols` with an
+appropriate cache directory on your machine.
+
+## Using the symbol server in Windbg
+
+The Windbg symbol path is configured with a string value delimited with asterisk
+characters. To use only the atom-shell symbol server, add the following entry to
+your symbol path (__note:__ you can replace `c:\code\symbols` with any writable
+directory on your computer, if you'd prefer a different location for downloaded
+symbols):
+
+```
+SRV*c:\code\symbols\*http://54.249.141.255:8086/atom-shell/symbols
+```
+
+Set this string as `_NT_SYMBOL_PATH` in the environment, using the Windbg menus,
+or by typing the `.sympath` command. If you would like to get symbols from
+Microsoft's symbol server as well, you should list that first:
+
+```
+SRV*c:\code\symbols\*http://msdl.microsoft.com/download/symbols;SRV*c:\code\symbols\*http://54.249.141.255:8086/atom-shell/symbols
+```
+
+## Using the symbol server in Visual Studio
+
+
+
+
+## Troubleshooting: Symbols will not load
+
+Type the following commands in Windbg to print why symbols are not loading:
+
+```
+> !sym noisy
+> .reload /f chromiumcontent.dll
+```
diff --git a/script/lib/util.py b/script/lib/util.py
index 83c3e05148b4..355fec027c45 100644
--- a/script/lib/util.py
+++ b/script/lib/util.py
@@ -183,6 +183,7 @@ def s3put(bucket, access_key, secret_key, prefix, key_prefix, files):
'--secret_key', secret_key,
'--prefix', prefix,
'--key_prefix', key_prefix,
+ '--no_overwrite',
'--grant', 'public-read'
] + files
diff --git a/script/upload-windows-pdb.py b/script/upload-windows-pdb.py
new file mode 100755
index 000000000000..e03e2bcfac7c
--- /dev/null
+++ b/script/upload-windows-pdb.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+
+import os
+import glob
+
+from lib.util import execute, rm_rf, safe_mkdir, s3put, s3_config
+
+
+SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
+SYMBOLS_DIR = 'dist\\symbols'
+DOWNLOAD_DIR = 'vendor\\brightray\\vendor\\download\\libchromiumcontent'
+PDB_LIST = [
+ 'out\\Release\\atom.exe.pdb',
+ DOWNLOAD_DIR + '\\Release\\chromiumcontent.dll.pdb',
+]
+
+
+def main():
+ os.chdir(SOURCE_ROOT)
+
+ rm_rf(SYMBOLS_DIR)
+ safe_mkdir(SYMBOLS_DIR)
+ for pdb in PDB_LIST:
+ run_symstore(pdb, SYMBOLS_DIR, 'AtomShell')
+
+ bucket, access_key, secret_key = s3_config()
+ files = glob.glob(SYMBOLS_DIR + '/*.pdb/*/*.pdb')
+ files = [f.lower() for f in files]
+ upload_symbols(bucket, access_key, secret_key, files)
+
+
+def run_symstore(pdb, dest, product):
+ execute(['symstore', 'add', '/r', '/f', pdb, '/s', dest, '/t', product])
+
+
+def upload_symbols(bucket, access_key, secret_key, files):
+ s3put(bucket, access_key, secret_key, SYMBOLS_DIR, 'atom-shell/symbols',
+ files)
+
+
+if __name__ == '__main__':
+ import sys
+ sys.exit(main())
diff --git a/script/upload.py b/script/upload.py
index 2ad7f5ffd8ef..7841017ed11e 100755
--- a/script/upload.py
+++ b/script/upload.py
@@ -59,19 +59,24 @@ def main():
upload_atom_shell(github, release_id,
os.path.join(DIST_DIR, CHROMEDRIVER_NAME))
- # Upload node's headers to S3.
- bucket, access_key, secret_key = s3_config()
- upload_node(bucket, access_key, secret_key, ATOM_SHELL_VERSION)
-
if args.publish_release:
- # Press the publish button.
- publish_release(github, release_id)
+ # Upload node's headers to S3.
+ bucket, access_key, secret_key = s3_config()
+ upload_node(bucket, access_key, secret_key, ATOM_SHELL_VERSION)
# Upload the SHASUMS.txt.
execute([sys.executable,
os.path.join(SOURCE_ROOT, 'script', 'upload-checksums.py'),
'-v', ATOM_SHELL_VERSION])
+ # Upload PDBs to Windows symbol server.
+ if TARGET_PLATFORM == 'win32':
+ execute([sys.executable,
+ os.path.join(SOURCE_ROOT, 'script', 'upload-windows-pdb.py')])
+
+ # Press the publish button.
+ publish_release(github, release_id)
+
def parse_args():
parser = argparse.ArgumentParser(description='upload distribution file')