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

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

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



답변

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

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

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

console.log(getStackTrace());

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


답변

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


답변

그러면 최신 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의 축소 된 텍스트가 의도 한 작은 작업에 비해 매우 큽니다.


답변

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

var trace = printStackTrace();


답변

이것은 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


답변

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

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

foo();

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


답변