发生正常异常时,会输出如下所示的堆栈跟踪:
util.js:38
case '%s': return String(args[i++]);
^
TypeError: Cannot convert object to primitive value
at String (unknown source)
at util.js:38:25
at String.replace (native)
at Object.<anonymous> (util.js:35:23)
at Object.<anonymous> (console.js:25:36)
at EventEmitter.<anonymous> (/project/src/routines/debug/boot.js:16:21)
at EventEmitter.emit (/project/node_modules/eventemitter2/lib/eventemitter2.js:319:22)
at /project/src/bootstrap.js:15:14
at /project/src/util/routineloader.js:36:11
at /project/src/util/routineloader.js:47:6
Run Code Online (Sandbox Code Playgroud)
哪个非常有帮助.当我在某处做以下事情时:
process.on('uncaughtException', function(err) {
console.trace();
throw err;
});
Run Code Online (Sandbox Code Playgroud)
我只得到:
Trace:
at EventEmitter.<anonymous> (/project/src/routines/debug/exceptions.js:4:17)
at EventEmitter.emit (events.js:88:20)
Run Code Online (Sandbox Code Playgroud)
这根本没有用.
如何让它返回整个堆栈跟踪,就像原始堆栈跟踪一样?
寻找一个处理堆栈跟踪的node.js包,类似于在RoR中完成此操作的方式:
如何从JavaScript打印堆栈跟踪?
答案如何在抛出异常时获取Javascript堆栈跟踪?处理抛出异常,但我需要打印堆栈跟踪来调试内存泄漏.
基本上我有一个相同的问题,如在Java中获取当前堆栈跟踪,但对于JavaScript.
以及如何在Node.js中打印堆栈跟踪?是类似的,但它是Node.js,我想知道JavaScript,更一般地说,如果它是不同的.
有没有办法从事件处理程序回调中判断哪个函数和/或对象发出(调用)该事件?
这是一个示例程序:
var EventEmitter, ee, rand, obj;
EventEmitter = require("events").EventEmitter;
ee = new EventEmitter();
ee.on('do it', cFunc);
obj = {
maybeMe: true,
emitting: function() {
ee.emit('do it');
}
}
function aFunc() {
ee.emit('do it');
}
function bFunc() {
ee.emit('do it');
}
function cFunc() {
console.log('Who called me to do it? aFunc or bFunc or obj (obj.emitting)?');
}
rand = Math.random();
if (rand < .3) {
aFunc();
} else if (rand < .6) {
bFunc();
} else {
obj.emitting();
}
Run Code Online (Sandbox Code Playgroud)
另外,如果发出的事件的源来自内置模块的 …
我的生产服务器上有一个节点应用程序会定期达到 100%。我希望能够向节点进程发送信号,该信号将为我提供堆栈跟踪,以便我可以找到代码中的问题所在。有什么简单的方法可以做到这一点吗?
我的服务器是 ubuntu 14.04.2,我正在运行节点 0.12.2
我一直在尝试调试我的节点应用程序,以便在我的日志中找到错误的来源,只显示为" Error: Can't set headers after they are sent
",没有跟踪信息或任何上下文.
碰巧,我想我现在已经解决了这个......我正在使用connect-timeout
并且我正在继续处理传递给异步网络操作的回调res.send()
,尽管req.timedout
已经设置为'true' ,回调最终会尝试执行connect-timeout
在网络运营期间.
但我仍然无法理解为什么我的日志没有显示此错误的跟踪信息.在我的代码中返回错误的任何地方我将其记录到控制台:
console.log(err);
Run Code Online (Sandbox Code Playgroud)
如果跟踪的可用信息err
的对象,这似乎被放置在err.stack
,不应该上述声明转储全部内容的err
(包括err.stack
)到控制台日志?我的理解是,通过上述操作,我不会丢失任何信息,例如:
console.log(err.stack);
Run Code Online (Sandbox Code Playgroud)
但是像这样的帖子似乎暗示了其他情况(虽然链接的帖子现在已经更新).
我实际上更进一步,并添加一些相关的文本,以帮助找到错误:
console.log('error in dodgyFunction:', err);
Run Code Online (Sandbox Code Playgroud)
但尽管如此,我仍然只是" Error: Can't set headers after they are sent
",没有任何上下文我会说.这是因为这个控制台错误消息是在外部库中输出的(比如express
)?我认为外部库应该将错误发送回主代码进行相应的处理?
编辑:这是我将错误和超时检查放在传递给异步操作的回调函数顶部的示例:
var execFile = require('child_process').execFile;
execFile('dodgycommand', options, function(error, stdout, stderr) {
if (req.timedout) {
console.log('timeout detected whilst running dodgycommand, so aborting...');
return;
}
if (error) { …
Run Code Online (Sandbox Code Playgroud) 我试图修改require
这样的
require = function (path) {
try {
return module.require(path);
} catch (err) {
console.log(path)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,此修改的范围仅在当前模块中.我想全局修改它,因此require
该模块的每个模块也将获得相同的require
函数副本.
基本上,我想SyntaxError
知道哪个文件有问题.我似乎找不到任何其他选择.如果我把module.require
在try/catch
块中,我能得到这引起了文件名SyntaxError
.