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
. 파이어 폭스에서 객체 및 함수 이름이 손실되고 크롬에서 객체 이름이 손실되지만 ( Error.captureStackTrace
) Error().stack
두 브라우저에서 모두 작동하며 디버그하기에 충분한 정보를 제공합니다.
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
(new Error).stack
그러면 최신 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