chrome 또는 firefox를 사용하여 javascript에서 console.trace ()의 결과를 얻는 방법은 무엇입니까?


99

console.trace()결과를 콘솔에 출력합니다.
결과를 문자열로 가져 와서 파일에 저장하고 싶습니다.

나는 함수의 이름을 정의하지 않으며 callee.caller.name.


1
이것은 PhantomJS에서 작동하지 않습니다 :(
ekkis

답변:


103

파이어 폭스에 대해 잘 모르겠지만 v8 / chrome에서는라는 오류 생성자에 대한 메서드를 사용할 수 있습니다 captureStackTrace. ( 여기에 더 많은 정보 )

그래서 그것을 얻는 해키 방법은 다음과 같습니다.

var getStackTrace = function() {
  var obj = {};
  Error.captureStackTrace(obj, getStackTrace);
  return obj.stack;
};

console.log(getStackTrace());

일반적으로 getStackTrace캡처되면 스택에 있습니다. 두 번째 인수 getStackTrace는 스택 추적에 포함되지 않습니다.


18
정보 감사합니다. 그것은 크롬에서 작동했지만 파이어 폭스에서는 그렇지 않았습니다. 그래서 다시 검색해서 Error().stack. 파이어 폭스에서 객체 및 함수 이름이 손실되고 크롬에서 객체 이름이 손실되지만 ( Error.captureStackTrace) Error().stack두 브라우저에서 모두 작동하며 디버그하기에 충분한 정보를 제공합니다.
js_

@Konstantin Smolyanin의 답변과 정확히 동일한 결과입니다. 결과적으로 동일한 제한된 세부 사항.
Codebeat

이것은 받아 들여진 대답이되어서는 안됩니다. 여기서 얻을 수있는 스택은 "상단 부분"만 포함하는 "절단"이지만 console.trace ()는 전체 스택을 표시합니다. 여기에서 스택 깊이가 30 인 예를 참조하십시오. stackoverflow.com/questions/62768598/…
mathheadinclouds

34

Error.stack이 필요합니다. Chrome 및 Firefox에서 작동합니다. 예를 들면

try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}

Chrome에서 줄 것입니다.

TypeError: Object #<Object> has no method 'debug'
    at eval at <anonymous> (unknown source)
    at eval (native)
    at Object._evaluateOn (unknown source)
    at Object._evaluateAndWrap (unknown source)
    at Object.evaluate (unknown source)

그리고 Firefox에서 :

@http://www.google.com.ua/:87 _firebugInjectedEvaluate("with(_FirebugCommandLine){try { var a = {}; a.debug() } catch(ex) {console.log(ex.stack)}\n};")
@http://www.google.com.ua/:87 _firebugEvalEvent([object Event])
@http://www.google.com.ua/:67

2
답변 해 주셔서 감사합니다. 그러나 예외가 발생한 경우에만 작동합니다. 예외없이 스택 추적이 필요합니다.
js_

8
무엇에 대한(new Error).stack
JasonSmith

이것은 a.debug ()에서 예외를 던져야합니다-스택을 얻는 데 비용이 많이 들지만 작동해야합니다.
fijiaaron

이 접근 방식은 어떤 이유로 든 PhantomJS 등에서 만 실행할 수있는 코드에서 추적을 얻으려고 할 때도 유용합니다.
waxspin 2014

18

그러면 최신 Chrome, Firefox, Opera 및 IE10 +에 대한 스택 추적 (문자열 배열)이 제공됩니다.

function getStackTrace () {

  var stack;

  try {
    throw new Error('');
  }
  catch (error) {
    stack = error.stack || '';
  }

  stack = stack.split('\n').map(function (line) { return line.trim(); });
  return stack.splice(stack[0] == 'Error' ? 2 : 1);
}

용법:

console.log(getStackTrace().join('\n'));

스택에서 자체 호출과 Chrome 및 Firefox (IE는 아님)에서 사용하는 "오류"라는 제목을 제외합니다.

이전 브라우저에서는 충돌하지 않고 빈 배열 만 반환합니다. 더 보편적 인 솔루션이 필요한 경우 stacktrace.js를 참조하십시오 . 지원되는 브라우저 목록은 정말 인상적이지만 내 생각에는 모든 종속성을 포함하여 37Kb의 축소 된 텍스트가 의도 한 작은 작업에 비해 매우 큽니다.


12

크로스 브라우저 스택 추적을 제공하는 stacktrace.js 라는 라이브러리가 있습니다 . 스크립트를 포함하고 언제든지 호출하여 간단히 사용할 수 있습니다.

var trace = printStackTrace();

ES6 약속을 지원하도록 구현이 변경 되었으므로 github.com/stacktracejs/stacktrace.js 를 살펴볼 것 입니다.
Erez Cohen

참고 지금이 사용되어야한다 : github.com/stacktracejs/stacktrace.js/tree/stable?files=1 (새 버전은 아직 공개되지 않은)
Erez 코헨

10

이것은 Konstantin의 우수한 코드에 대한 사소한 향상 일뿐입니다. 던지기 캐치 비용을 약간 줄이고 오류 스택을 인스턴스화합니다.

function getStackTrace () {
    let stack = new Error().stack || '';
    stack = stack.split('\n').map(function (line) { return line.trim(); });
    return stack.splice(stack[0] == 'Error' ? 2 : 1);
}

일반적으로 특정 수준의 스택 추적 (사용자 지정 로거 용)을 원하므로 다음을 호출 할 때도 가능합니다.

getStackTrace()[2]; // get stack trace info 2 levels-deep

6

당신은 단지 필요합니다 var stack = new Error().stack. 이것은 @sgouros 답변의 단순화 된 버전입니다.

function foo() {
  bar();
}
function bar() {
  baz();
}
function baz() {
  console.log(new Error().stack);
}

foo();

아마도 모든 브라우저에서 작동하지 않을 것입니다 (Chrome에서 작동).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.