This package is now a part of the core Atom repository, please direct all issues and pull requests there in the future!
Reports uncaught exceptions in Atom to bugsnag.
Catches exceptions and forwards them to bugsnag
License: MIT License
Reports uncaught exceptions in Atom to bugsnag.
In bugsnag, exceptions are associated with two tabs based on metadata fields reported with the exceptions, User Packages
and Bundled Packages
. Currently, all packages seem to be getting reported as user packages, which makes the information too noisy to be useful.
/cc @iolsen
parseStackTrace attempts to use the thrown value as a key in the StackTraceCache WeakMap.
WeakMap keys must be Objects, while non-Objects may be thrown. If a non-Object is thrown the following stack trace is generated:
Error reporting uncaught exception TypeError: Invalid value used as weak map key
at WeakMap.set (native)
at parseStackTrace (/Applications/Atom.app/Contents/Resources/app.asar/node_modules/exception-reporting/lib/reporter.js:115:23)
at shouldReport (/Applications/Atom.app/Contents/Resources/app.asar/node_modules/exception-reporting/lib/reporter.js:102:20)
at Object.exports.reportUncaughtException (/Applications/Atom.app/Contents/Resources/app.asar/node_modules/exception-reporting/lib/reporter.js:169:10)
at /Applications/Atom.app/Contents/Resources/app.asar/node_modules/exception-reporting/lib/main.js:21:27
at Function.module.exports.Emitter.simpleDispatch (/Applications/Atom.app/Contents/Resources/app.asar/node_modules/event-kit/lib/emitter.js:25:14)
at Emitter.module.exports.Emitter.emit (/Applications/Atom.app/Contents/Resources/app.asar/node_modules/event-kit/lib/emitter.js:125:28)
at /Applications/Atom.app/Contents/Resources/app.asar/src/atom-environment.js:832:32
Currently when the dev tools pops up it only shows the top of the stack for the errors that were logged.
This can make it hard to tell which package caused it and you have to do the whole open the dev tools first, reproduce the error, get the stack dance.
So start collecting the last 10 or so and make the log-able from dev tools using something like printRecentErrors()
.
This method could even check the stack and tell you which package it came from by looking for ~/.atom/packages
in the stack.
@jnunemaker says maybe 1-5k
[Enter steps to reproduce:]
Atom: 1.14.1 x64
Electron: 1.3.13
OS: Mac OS X 10.12.3
Thrown From: exception-reporting package 0.40.2
Uncaught TypeError: Path must be a string. Received undefined
At path.js:7
TypeError: Path must be a string. Received undefined
at assertPath (path.js:7:11)
at Object.join (path.js:1213:7)
at Object.tildify (/app.asar/node_modules/exception-reporting/node_modules/fs-plus/lib/fs-plus.js:64:39)
at /app.asar/node_modules/status-bar/lib/file-info-view.js:177:50)
at /app.asar/node_modules/status-bar/lib/file-info-view.js:160:12)
at /app.asar/node_modules/status-bar/lib/file-info-view.js:133:19)
at /app.asar/node_modules/status-bar/lib/file-info-view.js:27:24
at Function.module.exports.Emitter.simpleDispatch (/app.asar/node_modules/event-kit/lib/emitter.js:25:14)
at Emitter.module.exports.Emitter.emit (/app.asar/node_modules/event-kit/lib/emitter.js:129:28)
at /app.asar/src/pane-container.js:348:27
at Function.module.exports.Emitter.simpleDispatch (/app.asar/node_modules/event-kit/lib/emitter.js:25:14)
at Emitter.module.exports.Emitter.emit (/app.asar/node_modules/event-kit/lib/emitter.js:129:28)
at Pane.module.exports.Pane.setActiveItem (/app.asar/src/pane.js:300:22)
at Pane.module.exports.Pane.activateItemAtIndex (/app.asar/src/pane.js:435:19)
at Pane.module.exports.Pane.activatePreviousItem (/app.asar/src/pane.js:400:21)
at Pane.module.exports.Pane.removeItem (/app.asar/src/pane.js:585:16)
at Pane.module.exports.Pane.destroyItem (/app.asar/src/pane.js:658:16)
at TabBarView.module.exports.TabBarView.closeTab (/app.asar/node_modules/tabs/lib/tab-bar-view.js:333:26)
at HTMLDivElement.TabView.didClickCloseIcon (/app.asar/node_modules/tabs/lib/tab-bar-view.js:222:19)
-0:07.0 tree-view:show (atom-workspace.workspace.scrollbars-visible-when-scrolling.theme-one-dark-syntax.theme-atom-dark-ui)
atom-beautify 0.29.17
atom-fuzzy-grep 0.15.0
atom-lcov 2.0.0
atom-pair 2.0.10
atom-yamljson 0.2.3
cucumber 0.6.0
docblockr 0.9.1
docker 0.7.0
dockerletion 0.2.0
editorconfig 2.2.0
ember-cli-helper 0.9.0
ember-tabs 2.4.1
file-icons 2.0.15
git-plus 7.2.2
git-projects 1.17.0
git-tab-status 1.9.2
git-time-machine 1.5.4
go-debug 1.0.4
go-plus 5.1.1
go-signature-statusbar 1.2.0
highlight-selected 0.12.0
javascript-snippets 1.2.1
language-babel 2.54.1
language-chef 0.9.0
language-cucumber 0.0.1
language-docker 1.1.7
linter 1.11.21
linter-csslint 1.3.3
linter-docker 0.1.4
linter-eslint 8.1.0
linter-js-yaml 1.2.6
linter-jshint 3.0.2
linter-jsonlint 1.3.0
markdown-scroll-sync 2.1.2
merge-conflicts 1.4.4
pigments 0.39.0
project-colorize 0.2.0
project-plus 0.9.0
regex-railroad-diagram 0.16.0
sort-lines 0.14.0
symbols-tree-view 0.13.2
sync-settings 0.8.1
tabs-to-spaces 1.0.3
todo-show 1.9.0
@kevinsawicki mentioned that at one point, the exceptions reported to bugsnag had line numbers / stack trace references from the coffeescript source but we seem to have regressed as they are now from the JS:
Figure out a way to report these since they can be just as bad as render process exceptions.
When an exception occurs, and the stacktrace includes a core JavaScript API, the exception-reporting package fails to report the exception to bugsnag. For example, the stacktrace below involves an exception in the fuzzy-finder package, and the stacktrace includes a call to Array.forEach
:
~/github/fuzzy-finder/lib/main.js:81 Uncaught Error
at forEach (/Users/j/github/fuzzy-finder/lib/main.js:81:31)
===> at Array.forEach (native) <===
at Object.createProjectView (/Users/j/github/fuzzy-finder/lib/main.js:81:9)
at HTMLElement.fuzzy-finder:toggle-file-finder (/Users/j/github/fuzzy-finder/lib/main.js:12:14)
at CommandRegistry.handleCommandEvent (/Applications/Atom.app/Contents/Resources/app/src/command-registry.js:384:49)
at KeymapManager.module.exports.KeymapManager.dispatchCommandEvent (/Applications/Atom.app/Contents/Resources/app/node_modules/atom-keymap/lib/keymap-manager.js:621:22)
at KeymapManager.module.exports.KeymapManager.handleKeyboardEvent (/Applications/Atom.app/Contents/Resources/app/node_modules/atom-keymap/lib/keymap-manager.js:412:28)
at WindowEventHandler.handleDocumentKeyEvent (/Applications/Atom.app/Contents/Resources/app/src/window-event-handler.js:110:40)
When the exception-reporting package attempts to normalize the paths in the stacktrace, the package errors when it encounters Array.forEach
in the stacktrace. Instead of reporting the exception to bugsnag, the package logs an error to the console:
Error reporting uncaught exception TypeError: Cannot read property 'replace' of null
at Reporter.normalizePath (~/github/exception-reporting/lib/reporter.js:71:27)
at Reporter.scrubPath (~/github/exception-reporting/lib/reporter.js:77:31)
at ~/github/exception-reporting/lib/reporter.js:61:20
at Array.map (native)
at Reporter.buildStackTraceJSON (~/github/exception-reporting/lib/reporter.js:59:40)
at Reporter.buildExceptionJSON (~/github/exception-reporting/lib/reporter.js:54:24)
at Reporter.buildNotificationJSON (~/github/exception-reporting/lib/reporter.js:33:27)
at Reporter.reportUncaughtException (~/github/exception-reporting/lib/reporter.js:229:30)
at ~/github/atom/out/app/node_modules/exception-reporting/lib/main.js:25:23
at Function.module.exports.Emitter.simpleDispatch (/Applications/Atom.app/Contents/Resources/app/node_modules/event-kit/lib/emitter.js:25:20)
at Emitter.module.exports.Emitter.emit (/Applications/Atom.app/Contents/Resources/app/node_modules/event-kit/lib/emitter.js:141:34)
at window.onerror (/Applications/Atom.app/Contents/Resources/app/src/atom-environment.js:949:26)
at KeymapManager.module.exports.KeymapManager.dispatchCommandEvent (/Applications/Atom.app/Contents/Resources/app/node_modules/atom-keymap/lib/keymap-manager.js:621:22)
at KeymapManager.module.exports.KeymapManager.handleKeyboardEvent (/Applications/Atom.app/Contents/Resources/app/node_modules/atom-keymap/lib/keymap-manager.js:412:28)
at WindowEventHandler.handleDocumentKeyEvent (/Applications/Atom.app/Contents/Resources/app/src/window-event-handler.js:110:40)
apm link
it. We'll use fuzzy-finder for this example:
git clone atom/fuzzy-finder
cd fuzzy-finder
git checkout v1.8.1
apm install && apm link
main.js
to trigger an error that has a core JavaScript API in the stacktrace:
--- a/lib/main.js
+++ b/lib/main.js
@@ -78,6 +78,8 @@ module.exports = {
},
createProjectView () {
+ [0].forEach(() => { throw new Error('whoops') })
+
this.stopLoadPathsTask()
if (this.projectView == null) {
apm link
the package:
git clone atom/exception-reporting
cd exception-reporting
git checkout v0.43.1
apm install && apm link
lib/reporter.js
so that it will treat our local copy of fuzzy-finder as a bundled package for error reporting purposes:
--- a/lib/reporter.js
+++ b/lib/reporter.js
@@ -253,7 +253,7 @@ export default class Reporter {
}
isBundledFile (fileName) {
- return this.normalizePath(fileName).indexOf(this.resourcePath) === 0
+ return true
}
isTeletypeFile (fileName) {
Fuzzy Finder: Toggle File Finder
command to force the error above to be thrownExpected behavior: Error should be successfully posted to bugsnag
Actual behavior: Error is not reported to bugsnag
Reproduces how often: 100%
exception-reporting 0.43.1
$ atom --version
Atom : 1.27.0-dev-6dd878d
Electron: 1.7.11
Chrome : 58.0.3029.110
Node : 7.9.0
/cc @as-cii (since we encountered this issue while pairing today)
Take a look at bugsnag and you'll see what I mean. We're getting the same exception reported separately in lots of cases due to too much variation in paths. We need to relativize all paths in stack traces based on the resourcePath
if we can. Some won't be relative to the resource path and we can leave those absolute.
/cc @iolsen
I think its really cool, that the package checks if there is already an open issue on github. But the default button says Report Error and if you click it and the issue was in fact already reported, nothing happens. A good 2-3 seconds later the button changes to View Issue. I would appreciate it, if there was a visual indicator, that atom is searching online.
[Enter steps to reproduce below:]
1.installed svn package
2. clicked ctr + s
Atom Version: 1.9.1
System: Microsoft Windows 10 Pro
Thrown From: status-bar package, v1.4.0
Uncaught TypeError: Cannot read property 'ahead' of null
At C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\src\pane.js:1026
TypeError: Cannot read property 'ahead' of null
at status-bar-git.GitView.updateAheadBehindCount (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\node_modules\status-bar\lib\git-view.js:213:78)
at status-bar-git.GitView.update (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\node_modules\status-bar\lib\git-view.js:171:12)
at C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\node_modules\status-bar\lib\git-view.js:78:24
at Function.module.exports.Emitter.simpleDispatch (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\node_modules\event-kit\lib\emitter.js:25:14)
at Emitter.module.exports.Emitter.emit (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\node_modules\event-kit\lib\emitter.js:125:28)
at TextBuffer.module.exports.TextBuffer.saveAs (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\node_modules\text-buffer\lib\text-buffer.js:1135:27)
at TextBuffer.module.exports.TextBuffer.save (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\node_modules\text-buffer\lib\text-buffer.js:1105:19)
at TextEditor.module.exports.TextEditor.save (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\src\text-editor.js:740:26)
at Pane.module.exports.Pane.saveItem (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\src\pane.js:734:18)
at Pane.saveItem (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\src\pane.js:3:61)
at Pane.module.exports.Pane.saveActiveItem (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\src\pane.js:717:19)
at Workspace.module.exports.Workspace.saveActivePaneItem (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\src\workspace.js:690:35)
at atom-workspace.commandRegistry.add.core:save (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\src\register-default-commands.js:220:32)
at CommandRegistry.module.exports.CommandRegistry.handleCommandEvent (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\src\command-registry.js:260:29)
at C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\src\command-registry.js:3:61
at KeymapManager.module.exports.KeymapManager.dispatchCommandEvent (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\node_modules\atom-keymap\lib\keymap-manager.js:580:16)
at KeymapManager.module.exports.KeymapManager.handleKeyboardEvent (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\node_modules\atom-keymap\lib\keymap-manager.js:388:22)
at WindowEventHandler.module.exports.WindowEventHandler.handleDocumentKeyEvent (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\src\window-event-handler.js:98:36)
at HTMLDocument.<anonymous> (C:\Users\raj\AppData\Local\atom\app-1.9.1\resources\app.asar\src\window-event-handler.js:3:61)
-0:06.0 core:save (atom-text-editor.editor.is-focused)
{}
# User
svn, v0.0.12 (active)
tortoise-svn, v0.5.0 (inactive)
atom-dark-syntax, v0.27.0 (inactive)
atom-dark-ui, v0.51.0 (inactive)
atom-light-syntax, v0.28.0 (inactive)
atom-light-ui, v0.43.0 (inactive)
base16-tomorrow-dark-theme, v1.1.0 (inactive)
base16-tomorrow-light-theme, v1.1.1 (inactive)
one-dark-ui, v1.3.2 (active)
one-light-ui, v1.3.2 (inactive)
one-dark-syntax, v1.2.0 (active)
one-light-syntax, v1.2.0 (inactive)
solarized-dark-syntax, v1.0.2 (inactive)
solarized-light-syntax, v1.0.2 (inactive)
about, v1.5.2 (active)
archive-view, v0.61.1 (active)
autocomplete-atom-api, v0.10.0 (active)
autocomplete-css, v0.11.1 (active)
autocomplete-html, v0.7.2 (active)
autocomplete-plus, v2.31.0 (active)
autocomplete-snippets, v1.11.0 (active)
autoflow, v0.27.0 (inactive)
autosave, v0.23.1 (active)
background-tips, v0.26.0 (active)
bookmarks, v0.41.0 (active)
bracket-matcher, v0.82.1 (active)
command-palette, v0.38.0 (inactive)
deprecation-cop, v0.54.1 (active)
dev-live-reload, v0.47.0 (active)
encoding-selector, v0.22.0 (active)
exception-reporting, v0.38.1 (active)
fuzzy-finder, v1.3.0 (active)
git-diff, v1.1.0 (active)
find-and-replace, v0.198.0 (inactive)
go-to-line, v0.31.0 (inactive)
grammar-selector, v0.48.1 (active)
image-view, v0.58.0 (active)
incompatible-packages, v0.26.1 (active)
keybinding-resolver, v0.35.0 (active)
line-ending-selector, v0.5.0 (active)
link, v0.31.1 (inactive)
markdown-preview, v0.158.0 (active)
metrics, v0.53.1 (active)
notifications, v0.64.1 (active)
open-on-github, v1.2.0 (inactive)
package-generator, v1.0.0 (inactive)
settings-view, v0.238.0 (active)
snippets, v1.0.2 (active)
spell-check, v0.67.1 (active)
status-bar, v1.4.0 (active)
styleguide, v0.46.0 (active)
symbols-view, v0.113.0 (inactive)
tabs, v0.98.0 (active)
timecop, v0.33.1 (active)
tree-view, v0.208.0 (active)
update-package-dependencies, v0.10.0 (active)
welcome, v0.34.0 (active)
whitespace, v0.32.2 (active)
wrap-guide, v0.38.1 (active)
language-c, v0.52.1 (active)
language-clojure, v0.21.0 (active)
language-coffee-script, v0.47.0 (active)
language-csharp, v0.12.1 (active)
language-css, v0.36.2 (active)
language-gfm, v0.86.0 (active)
language-git, v0.13.0 (active)
language-go, v0.42.0 (active)
language-html, v0.44.1 (active)
language-hyperlink, v0.16.0 (active)
language-java, v0.22.0 (active)
language-javascript, v0.119.0 (active)
language-json, v0.18.0 (active)
language-less, v0.29.3 (active)
language-make, v0.22.2 (active)
language-mustache, v0.13.0 (active)
language-objective-c, v0.15.1 (active)
language-perl, v0.35.0 (active)
language-php, v0.37.0 (active)
language-property-list, v0.8.0 (active)
language-python, v0.45.0 (active)
language-ruby, v0.68.5 (active)
language-ruby-on-rails, v0.25.0 (active)
language-sass, v0.52.0 (active)
language-shellscript, v0.22.3 (active)
language-source, v0.9.0 (active)
language-sql, v0.21.1 (active)
language-text, v0.7.1 (active)
language-todo, v0.28.0 (active)
language-toml, v0.18.0 (active)
language-xml, v0.34.8 (active)
language-yaml, v0.26.0 (active)
# Dev
No dev packages
I noticed exception-reporting.userId
is stored in my config.cson. I'd like to commit my config.cson to my dotfiles. Should I scrub my userId
out first?
Now that electron/electron#86 has been fixed, the full stack trace is available in window.onerror
(as the fourth argument), we should pass that information to bugsnag.
Exception are more "normal" in dev mode and maybe shouldn't be reported at all since throwing things is something done just for debugging purposes.
You have the core package "exception-reporting" installed as a community package. See https://github.com/atom/dalek for how this causes problems and instructions on how to correct the situation.
<unknown> (/usr/lib/atom/node_modules/dalek/lib/main.js:14:14)
Function.module.exports.Emitter.simpleDispatch (/usr/lib/atom/node_modules/event-kit/lib/emitter.js:25:14)
Emitter.emit (/usr/lib/atom/node_modules/event-kit/lib/emitter.js:141:28)
<unknown> (/usr/lib/atom/src/package-manager.js:506:32)
The following ticket was created by this reporting (afaik): atom-community/sync-settings#291
But the stacktrace doesn't mention sync-settings
anywhere but gist-it
. Shouldn't the ticket have been created against that repo instead?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.