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.