如何在 Node.js 中打印堆栈跟踪?

Does anyone know how to print a stack trace in Node.js?

转载于:https://stackoverflow.com/questions/2923858/how-to-print-a-stack-trace-in-node-js

0

9个回答

Any Error object has a stack member that traps the point at which it was constructed.

var stack = new Error().stack
console.log( stack )

or more simply:

console.trace("Here I am!")
29
csdnceshi51
旧行李 console.log(err.stack) and console.trace() do not give you same results. Whereas err.stack gives you the stack trace for the err object itself (functioning the way we all normally think of exceptions), console.trace() will print out the call stack at the point where console.trace() is being called. So if you catch some error being thrown by some deeper layer of code, console.trace() will not contain that deeper layer code in the stack trace since that code is no longer on the stack. However, console.log(err.stack) will contain the deeper layers as long as it threw an Error object.
6 年多之前 回复
csdnceshi63
elliott.david One advantage of trace is it shows the current line/context as well which stack does not. The info is in the error object if you want to manually create that line I guess.
接近 7 年之前 回复
csdnceshi55
~Onlooker +1 for also showing new Error().stack, which works in cases where you don't want to involve the console.
大约 7 年之前 回复
csdnceshi53
Lotus@ As of now, sys is depricated. It is replaced by 'util'.
8 年多之前 回复
weixin_41568208
北城已荒凉 or just sys.puts(new Error().stack) (after adding the system module)
大约 9 年之前 回复

Now there's a dedicated function on console for that:

console.trace()
22
weixin_41568126
乱世@小熊 By default this will only show 10 frames, you can use the command-line argument to increase this, e.g. --stack_trace_limit=200
3 年多之前 回复
weixin_41568131
10.24 Just make sure to heed the above comment about console.trace().
接近 5 年之前 回复

With a readily available Node module, it is possible to get full-length stack traces out of Node (albeit with a minor performance penalty): http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack-traces-for-node-js

9
csdnceshi76
斗士狗 Link dead but one may peruse the archived copy here or check out the library.
一年多之前 回复

For what I know printing the complete stack trace in nodejs is not possible, you can just print a "partial" stack trace, you can not see from where you came from in the code, just where the Exception occur. That's what Ryan Dahl explains in this youtube video. http://youtu.be/jo_B4LTHi3I at min 56:30 for being precise. Hope this helps

8
csdnceshi60
℡Wang Yan true, but the module in @Timboudreau's answer "fixes" that
4 年多之前 回复

To print stacktrace of Error in console in more readable way:

console.log(ex, ex.stack.split("\n"));

Example result:

[Error] [ 'Error',
  '    at repl:1:7',
  '    at REPLServer.self.eval (repl.js:110:21)',
  '    at Interface.<anonymous> (repl.js:239:12)',
  '    at Interface.EventEmitter.emit (events.js:95:17)',
  '    at Interface._onLine (readline.js:202:10)',
  '    at Interface._line (readline.js:531:8)',
  '    at Interface._ttyWrite (readline.js:760:14)',
  '    at ReadStream.onkeypress (readline.js:99:10)',
  '    at ReadStream.EventEmitter.emit (events.js:98:17)',
  '    at emitKey (readline.js:1095:12)' ]
6

As already answered, you can simply use the trace command:

console.trace("I am here");

However, if you came to this question searching about how to log the stack trace of an exception, you can simply log the Exception object.

try {  
  // if something unexpected
  throw new Error("Something unexpected has occurred.");     

} catch (e) {
  console.error(e);
}

It will log:

Error: Something unexpected has occurred.
    at main (c:\Users\Me\Documents\MyApp\app.js:9:15)
    at Object. (c:\Users\Me\Documents\MyApp\app.js:17:1)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3


If your Node.js version is < than 6.0.0, logging the Exception object will not be enough. In this case, it will print only:

[Error: Something unexpected has occurred.]

For Node version < 6, use console.error(e.stack) instead of console.error(e) to print the error message plus the full stack, like the current Node version does.


Note: if the exception is created as a string like throw "myException", it's not possible to retrieve the stack trace and logging e.stack yields undefined.

To be safe, you can use

console.error(e.stack || e);

and it will work for old and new Node.js versions.

4
csdnceshi70
笑故挽风 you save my day)
大约一年之前 回复
csdnceshi52
妄徒之命 sorry I just discovered something crucial. See my comment against the related post: stackoverflow.com/questions/42528677/…. It seems that logging the error on its own does indeed show the whole content of the error, but trying to concatenate it (like a string) with other text will cause only the brief message part to be used. It all makes a lot more sense with that realisation.
2 年多之前 回复
weixin_41568183
零零乙 try installing n to test different Node versions in your machine or see this test with Node 7.4 and compare it with Node 0.8. I could not get a permalink for the last one, but run console.error(new Error("test")) to see the difference. Regarding a reference about this change in behavior, I couldn't get one in Node change logs. It seems to be a V8 change, but I also couldn't confirm.
2 年多之前 回复
csdnceshi52
妄徒之命 do you have a reference for this apparent change in behaviour? I'm still seeing (with node 6.9.4) that console.error(e) only prints the brief message. And I suspect that it's because it prints a toString representation of e, and toString for e only returns the message and nothing else: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
2 年多之前 回复
weixin_41568183
零零乙 confirmed that this behavior changed on version 6.0.0
2 年多之前 回复
weixin_41568183
零零乙 thank you for pointing this out. It seems that behavior has changed between Node versions 4.x and 7.x (probably a V8 change). I've updated my answer.
2 年多之前 回复
csdnceshi52
妄徒之命 Won't console.error(e) print everything in the e object, including e.stack?
2 年多之前 回复

If you want to only log the stack trace of the error (and not the error message) Node 6 and above automatically includes the error name and message inside the stack trace, which is a bit annoying if you want to do some custom error handling:

console.log(error.stack.replace(error.message, ''))

This workaround will log only the error name and stack trace (so you can, for example, format the error message and display it how you want somewhere else in your code).

The above example would print only the error name follow by the stack trace, for example:

Error: 
    at /Users/cfisher/Git/squashed/execProcess.js:6:17
    at ChildProcess.exithandler (child_process.js:213:5)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:877:16)
    at Socket.<anonymous> (internal/child_process.js:334:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:498:12)

Instead of:

Error: Error: Command failed: sh ./commands/getBranchCommitCount.sh HEAD
git: 'rev-lists' is not a git command. See 'git --help'.

Did you mean this?
        rev-list

    at /Users/cfisher/Git/squashed/execProcess.js:6:17
    at ChildProcess.exithandler (child_process.js:213:5)
    at emitTwo (events.js:106:13)
    at ChildProcess.emit (events.js:191:7)
    at maybeClose (internal/child_process.js:877:16)
    at Socket.<anonymous> (internal/child_process.js:334:11)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at Pipe._handle.close [as _onclose] (net.js:498:12)
3

Try Error.captureStackTrace(targetObject[, constructorOpt]).

const myObj = {};
function c() {
  // pass
}

function b() {
    Error.captureStackTrace(myObj)
    c()
} 

function a() {
    b()
}

a()

console.log(myObj.stack)

The function a and b are captured in error stack and stored in myObj.

2
csdnceshi55
~Onlooker If you want an error to have a stack property, you'll need to call this if Node >= 6: Error.captureStackTrace(error).
12 个月之前 回复

you can use node-stack-trace module which is a power full module to track call stacks.

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
windows平台调用函数堆栈的追踪方法
在windows平台,有一个简单的方法来追踪调用函数的堆栈,就是利用函数CaptureStackBackTrace,但是这个函数不能得到具体调用函数的名称,只能得到地址,当然我们可以通过反汇编的方式通过地址得到函数的名称,以及具体调用的反汇编代码,但是对于有的时候我们需要直接得到函数的名称,这个时候据不能使用这个方法,对于这种需求我们可以使用函数:SymInitialize、StackWalk、Sy
日志中如何输出完整的堆栈异常
程序中发生异常后,我们捕捉到异常之后一般是输出e.toString到日志,这样我们只能知道异常类型是什么,只有一个简单的描述,无法看到具体的堆栈信息。利用下面一段代码,可以将完整的堆栈信息输出到日志系统中。
异常跟踪栈
一 异常跟踪栈简介异常对象的printStackTrace方法用于打印异常的跟踪栈信息,根据printStackTrace方法的输出结果,我们可以找到异常的源头,并跟踪到异常一路触发的过程。 二 main方法中异常跟踪栈的应用1 代码示例 class SelfException extends RuntimeException { SelfException(){} SelfExce
jstack 命令跟踪 java 应用的堆栈 并分析堆栈结果
1、找到java进程ID 运行命令# ps -ef|grep java | grep -v grep 运行命令后可得到进程ID为:3407 2、找到此进程中消耗CPU较高的线程ID 运行命令# top Hp3407 在上图TIME+列,表示为消耗CPU时间。如图得出消耗时间较长的线程ID为:3451 3、将线程ID转换为16进制 运行命令# printf "%x\n"
python优雅的记录日志(堆栈追踪)
    工作3年,解决线上问题无数。日志对于定位和分析问题的重要行不言而喻。那么python怎么优雅的记录日志呢?       首先,python记录日志,首选是logging模块,没有啥争议。     日志的一般写法是这样的: logging.info('info message') logging.error('error message')    这种日志一般作用不大,只能定位到...
Node.js-longjohn-node.js的长堆栈跟踪具有可配置调用跟踪长度
longjohn - node.js的长堆栈跟踪具有可配置调用跟踪长度
linux用户态程序定位方法总结1 打印调用栈
用户态调用栈可以用backtrace_symbols追踪函数调用栈
VC++ 崩溃处理以及打印调用堆栈
我们在程序发布后总会面临崩溃的情况,这个时候一般很难重现或者很难定位到程序崩溃的位置,之前有方法在程序崩溃的时候记录dump文件然后通过windbg来分析。那种方法对开发人员的要求较高,它需要程序员理解内存、寄存器等等一系列概念还需要手动加载对应的符号表。Java、Python等等语言在崩溃的时候都会打印一条异常的堆栈信息并告诉用户那块出错了,根据这个信息程序员可以很容易找到对应的代码位置并进行处...
Java问题定位之如何借助线程堆栈进行问题分析
在大型的应用中,线程堆栈打印出来特别多,如何从众多的信息中找到真正有用,有价值的信息,需要一定的技巧。本文对此详细介绍。 我们可以从三个方面分析:堆栈的局部信息,一次堆栈的统计信息,多个堆栈的对比信息。 从一次的堆栈信息中,我们可以直接获取以下信息: 每一个线程的调用关系,当前线程在调用哪些函数每个线程的当前状态,持有那些锁,在等待那些锁? 从一次堆栈信息中,我们还可以统计以
jstack java堆栈跟踪工具
jstack Stack Trace for Java 生成虚拟机当前线程快照 这个主要用来查找线程长时间没有响应原因 命令格式:jstack [option ] vmid 选项: -F 强制输出线程堆栈 -l 除了堆栈外,附加锁信息 -m 本地方法堆栈 示例 ...
如何正确地打印异常堆栈信息
前言 最近老大让我修改项目里所有和log有关的代码,之前我也用过log4j、slf4j或者Logback等日志框架/接口,一直以为打印异常信息就是简单地一句log.info()或者log.error()而已,没想到原来一直都使用错了,以至于有些错误信息没能在log文件中打印出堆栈信息,最终难以定位bug,排查困难。 如何正确地打印异常的堆栈信息? 一般在catch到异常的时候,不要使用e.prin...
在Linux应用程序中打印函数调用栈
在Linux中打印函数调用栈 要求 在Linux系统的应用程序中写一个函数print_stackframe(),用于获取当前位置的函数调用栈信息 方法 execinfo.h库下的函数backtrace可以得到当前线程的函数调用栈指针和调用栈深度,backtrace_symbols可以将调用栈指针转化为字符串信息。详见Backtraces或在Linux命令行运行命令man backtrace. 代码...
go打印堆栈
在调试go程序的过程中,可能会出现重复关闭chan的情况,可能会有多个路径执行关闭操作,为了确定操作路径可以使用runtime/debug包中的PrintStack()打印堆栈,最后确定具体的执行路径。参考代码如下[1]:package mainimport ( "runtime/debug" )func main() { defer func() { if err
Java问题定位之Java线程堆栈分析
采用Java开发的大型应用系统越来越大,越来越复杂,很多系统集成在一起,整个系统看起来像个黑盒子。系统运行遭遇问题(系统停止响应,运行越来越慢,或者性能底下,甚至系统宕掉),如何速度命中问题的根本原因是我们接下来讲的目的。本系列文章将Java问题定位的方法体系化,提供一种以黑盒子方式进行问题定位的思路:如何使用线程堆栈进行性能瓶颈分析?如何分析内存泄漏?如何分析系统挂死? 文章思路 总
如何获得java中的Exception的堆栈跟踪信息
大家都知道,下面一段代码可以直接输出异常的堆栈跟踪信息: try { ... } catch(Exception e) { e.printStackTrace(); } 可是,事实上在我们开发程序的过程中除非是做调试,一般均采用log4j做为错误信息输出的工具。而Exception本身并未提供将堆栈跟踪信息以字符串形式返回的函数。 ...
Node.js-stackman-类似Batman但用于Node.js堆栈跟踪
stackman - 类似Batman,但用于Node.js堆栈跟踪
C#调试过程中如何将堆栈信息写入文件
在C#开发的程序过程中,经常遇到崩溃问题,而调试这些问题又非常的棘手,此文给出了调试过程中生成堆栈办法,为调试,特别是远程调试提供了方便。 修改程序入口文件Program.cs,请参考如下代码: using System; using System.IO; using System.Collections.Generic; using System.Windows.Forms; u
log4j打印抛出异常时堆栈内容
JAVA 中为快速定位,抛出异常的位置。往往需要在日志中描述。 log.err("异常出错点", e); 会将出错时的堆栈信息显示出来。 package com.jqyc.jase; import static org.junit.Assert.*; import org.apache.log4j.Logger; import org.junit.Test; public class T
函数调用堆栈追踪(2)
在上一篇中介绍的2种方法都是在代码的某个特定的地方查看函数的调用关系,接下来介绍的2个工具可以追踪程序从main函数开始全部执行过的函数。 1.uftrace    1.1安装 工具在github上下载,地址如下: https://github.com/namhyung/uftrace    readme里提供了一些简单的示例来说明uftrace的使用,这里主要针对稍复杂点的工程,演示程
JAVA 利用Throwable和Thread分析堆栈跟踪元素
堆栈跟踪是一个方法调用过程的立标,它包含了程序执行过程中方法的调用的特定位置。可以使用Throwable类和Thread类提供 的接口获取堆栈信息,进行分析调用情况。废话少说直接上代码: //方法1:查看堆栈中的文本信息 Throwable t= new Throwable(); StringWriter out=new StringWriter(); t.printStac
[笔记]erlang的异常处理
erlang的异常处理没有什么太大的特别的 异常分为: error throw exit(一般正常退出也用这个) 原来的做法是用catch: 1&amp;gt; catch 0. 0 2&amp;gt; catch throw(0). 0 3&amp;gt; catch a=b. {'EXIT',{{badmatch,b},[{erl_eval,expr,3,[]}]}} 4&amp;gt; cat...
php中堆栈调试
你是否想知道当前函数被哪些文件调用了,如果知道了这些路径,我们就能很好的理解程序的执行过程,这是非常重要的,也是了解别人程序的基础,那么这里我就给大家介绍一种php中的堆栈调试的方法,其实就是php内置的一个函数debug_backtrace();下面是就稍微介绍一下吧,具体还是要看手册哦,喜欢看手册的程序员才是前途无量的$statcks = debug_backtrace(); $tmp_arr
屏蔽freemarker打印堆栈信息和模板调试时打印堆栈信息到页面
今天看着我们公司之前网站所使用的freemarker模板的时候难免会存在很多语法错误,比如转时间,对象为空然后调用对象的属性,在我们控制台就会打印一些堆栈错误,如果网站正式运行了,那么我们的日志里保存的日志大部分都是freemarker堆栈错误,这个在不需要调试页面的时候是很占资源的,后来我就想我必须要把这个堆栈信息给屏蔽了(我有强迫症)。 在百度搜索了一圈基本上搜索到的都是有关freemark
c# 执行请求的过程中出现错误时配置报错页面代替错误堆栈跟踪
通过 节,可以配置,在执行请求的过程中出现未处理的错误时要执行的操作。具体而言, 开发人员通过该节可配置要显示的 html 错误页,以代替错误堆栈跟踪。在web.config文件的configuration节点下面添加如下代码: <customErrors mode="RemoteOnly" defaultRedirect="/Pages/Error/Error.aspx"> <e
跟踪Android callback 调用堆栈
0 在调试 android  系统时可以通过打印调用堆栈 callback stack 来分析和解决android问题。1 java 层打印callback stack 可以通过 catch exception 然后 使用 Log.w(LOGTAG, Log.getStackTraceString(throwable)) 打印调用堆栈Throwable throwable = new Throwa
串口SCR查看当前窗口堆栈命令
 串口查看Android的窗口堆栈:dumpsys window
【调试中非常重要的技巧】如何从错误堆栈的输出判断程序出错的准确位置?
大家都知道在非J2ME程序中,捕捉异常后用ex.printStackTrace()可以得到错误堆栈,错误堆栈中除了有错误信息(原因)外,还有抛出异常的位置在源文件的行数,从而可以准确地定位错误。   但是在J2ME程序中,用ex.printStackTrace()输出的信息似乎并不是抛出异常的位置在源文件的准确行数,现在有一个简单示例如下:   类MIDletTest2.java: impo
利用Xposed Hook打印Java函数调用堆栈信息的几种方法
本文博客链接:http://blog.csdn.net/QQ1084283172/article/details/79378374在进行Android逆向分析的时候,经常需要进行动态调试栈回溯,查看Java函数的调用流程,Android的smali动态调试又不是很方便,因此使用Android的Java Hook的方法,打印Java函数调用堆栈信息辅助静态分析。package com.xposedd...
调试应用程序通常需要使用堆栈跟踪
调试应用程序通常需要使用堆栈跟踪。每当您的应用程序因为错误或异常而崩溃时,就会生成堆栈跟踪。也可以使用如下方法在应用程序代码中的任意位置打印堆栈跟踪 Thread.dumpStack()。当您的应用在连接的设备上以调试模式运行时,Android Studio会在logcat视图中打印并突出显示堆栈轨迹,如图1所示参考资料:Analyze a Stack Trace...
go 代码的调试---打印调用堆栈
本文介绍如何打印调用堆栈进行go代码的调试。打印堆栈使用的runtime package中的Stack()函数> func Stack(buf []byte, all bool) int Stack formats a stack trace of the calling goroutine into buf and returns the number of bytes written to
iOS异常捕获-堆栈信息的解析
最近使用NSSetUncaughtExceptionHandler和signal方法捕获异常,但是捕获到的都是堆栈信息 ,如何利用这些堆栈信息查看报错方法名和行数?
函数调用堆栈追踪(1)
对于一个比较大的工程,函数的调用关系错综复杂,这时候仅仅靠IDE静态查看函数的调用关系已经远远不够,所以为了更好地理解代码,还是有必要去掌握一些方法和工具来跟踪函数的调用堆栈。 一、      设断点 在eclipse里可以设置断点查看函数的堆栈调用情况,这里比较方便的是可以直接定位到上级函数查看变量的值。 二、      使用backtrace backtrace功能可以跟踪函数的
在tensorflow程序运行过程中跟踪变量的方法,通过tf.Print实现
# tf.Print( # input_, # input_: A tensor passed through this op. 输入单元 # data, # data: A list of tensors to print out when op is evaluated 输出单元 # message=None, # mess...
解决Java抛出的异常,log中不含具体的堆栈信息
最近,在做项目的时候,遇到一个问题,抛了exception异常,但是定位到log的时候却发现log信息打印不全,并不能根据异常定位到具体的位置。 解决方法:配置JVM参数 -XX:-OmitStackTraceInFastThrow
nodejs异步和回调
什么是异步 比如早上起来,我需要洗口3min,烧水3min,冲牛奶,做这三件事的过程我们分析一,假设烧水只需要按一下开关,冲牛奶不耗时 异步:烧水,洗口–&amp;gt;冲牛奶=3min 同步:洗口–&amp;gt;烧水–&amp;gt;冲牛奶=6min nodejs机制 nodejs是单线程语言,所有事件都是放在一个堆栈中去进行,必须把当前函数栈清空才会去执行后面代码,但是是不是就不能做到异步呢,也不是,它有特例,no...
IOS打印调用堆栈
NSLog(@"%@",[NSThread callStackSymbols]);
gdb常用调试命令以及多线程堆栈的查看
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。 一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。
在REPL运行环境中使用下划线
本课程主要介绍了Node.js中交互式运行环境REPL的使用方法,包括如何在REPL中执行命令,与Node.js交互等。
在REPL环境中编写和执行函数
本课程主要介绍了Node.js中交互式运行环境REPL的使用方法,包括如何在REPL中执行命令,与Node.js交互等。
将完整的异常堆栈输出到某个字符串中
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; public class ExceptionUtils { public static void main(String[] args) {...
相关热词 c#串口测试应用程序 c# 匹配 正则表达式 c#防止窗体重绘 c#读写txt文件 c#挖地雷源代码 c#弹框选项 c# 移除 队列 c# 密码写入配置文件 c# 获取可用内存大小 c# 嵌入excel编辑