Firebug에는 특정 함수 이름에 대한 호출을 기록하는 기능이 있습니다. 때때로 페이지 렌더링을 중지하지만 오류나 경고를 일으키지 않는 버그를 찾고 있습니다. 버그는 절반 정도만 나타납니다. 그렇다면 전체 프로그램에 대한 모든 함수 호출 목록이나 전체 프로그램 실행에 대한 일종의 스택 추적을 어떻게 얻을 수 있습니까?
Firebug에는 특정 함수 이름에 대한 호출을 기록하는 기능이 있습니다. 때때로 페이지 렌더링을 중지하지만 오류나 경고를 일으키지 않는 버그를 찾고 있습니다. 버그는 절반 정도만 나타납니다. 그렇다면 전체 프로그램에 대한 모든 함수 호출 목록이나 전체 프로그램 실행에 대한 일종의 스택 추적을 어떻게 얻을 수 있습니까?
답변:
스택 추적이 필요할 때 다음을 수행합니다. 아마도 여기에서 영감을 얻을 수 있습니다.
function logStackTrace(levels) {
var callstack = [];
var isCallstackPopulated = false;
try {
i.dont.exist += 0; //doesn't exist- that's the point
} catch (e) {
if (e.stack) { //Firefox / chrome
var lines = e.stack.split('\n');
for (var i = 0, len = lines.length; i < len; i++) {
callstack.push(lines[i]);
}
//Remove call to logStackTrace()
callstack.shift();
isCallstackPopulated = true;
}
else if (window.opera && e.message) { //Opera
var lines = e.message.split('\n');
for (var i = 0, len = lines.length; i < len; i++) {
if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
var entry = lines[i];
//Append next line also since it has the file info
if (lines[i + 1]) {
entry += " at " + lines[i + 1];
i++;
}
callstack.push(entry);
}
}
//Remove call to logStackTrace()
callstack.shift();
isCallstackPopulated = true;
}
}
if (!isCallstackPopulated) { //IE and Safari
var currentFunction = arguments.callee.caller;
while (currentFunction) {
var fn = currentFunction.toString();
var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
callstack.push(fname);
currentFunction = currentFunction.caller;
}
}
if (levels) {
console.log(callstack.slice(0, levels).join('\n'));
}
else {
console.log(callstack.join('\n'));
}
};
중재자 주 :이 답변의 코드는 Eric Wenderlin의 블로그의이 게시물 에도 나타나는 것으로 보입니다 . 이 답변의 작성자는 여기에 링크 된 블로그 게시물 이전에 작성된 자신의 코드라고 주장합니다. 선의의 목적으로 게시물과이 메모에 링크를 추가했습니다.
코드를 한 번에 한 줄씩 또는 한 번에 한 함수 씩 실행하여 올바르게 작동하지 않는 위치를 확인하십시오. 또는 코드를 통해 적절한 추측을하고 로깅 문을 분산 시키십시오.
console.log('something')
함수에 많은 문을 추가하여 어떤 문이 호출되고 있는지 확인합니다.