방화범을 사용하여 전체 프로그램에 대한 기능 로그 / 스택 추적 인쇄


94

Firebug에는 특정 함수 이름에 대한 호출을 기록하는 기능이 있습니다. 때때로 페이지 렌더링을 중지하지만 오류나 경고를 일으키지 않는 버그를 찾고 있습니다. 버그는 절반 정도만 나타납니다. 그렇다면 전체 프로그램에 대한 모든 함수 호출 목록이나 전체 프로그램 실행에 대한 일종의 스택 추적을 어떻게 얻을 수 있습니까?

답변:


218

Firefox는 console.trace() 호출 스택을 인쇄하는 데 매우 편리한 기능을 제공합니다 . ChromeIE 11 에서도 사용할 수 있습니다 .

또는 다음과 같이 시도하십시오.

function print_call_stack() {
  var stack = new Error().stack;
  console.log("PRINTING CALL STACK");
  console.log( stack );
}

3
스택의 길이를 늘리는 방법이 있습니까? 그것은 매우 도움이 될 것입니다.
Ravi Teja

✚1 console.warn ( '[경고] 통화 스택 :', new Error (). stack);
user1742529

13

스택 추적이 필요할 때 다음을 수행합니다. 아마도 여기에서 영감을 얻을 수 있습니다.

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의 블로그의이 게시물 에도 나타나는 것으로 보입니다 . 이 답변의 작성자는 여기에 링크 된 블로그 게시물 이전에 작성된 자신의 코드라고 주장합니다. 선의의 목적으로 게시물과이 메모에 링크를 추가했습니다.


2
Firebug에서이를 수행 할 수있는 console.trace () 호출이 있습니다.
amccormack 2011 년

이것은 훌륭합니다. Firebug는 축소 된 파일에 문제가 있습니다.이 스크립트가 해결합니다!
pstadler

1
FWIW @ andrew-barber, 답변의 저자는 자신의 것으로 주장하지 않았습니다. 그냥 귀속하지 않았습니다. 편집은 주석이어야합니다.
Ascherer 2015-08-30

7

나는 방화범없이 이것을 달성했다. 크롬과 파이어 폭스 모두에서 테스트 :

console.error("I'm debugging this code.");

프로그램이 콘솔에 인쇄하면 작은 화살표를 클릭하여 호출 스택을 확장 할 수 있습니다.


2

코드를 한 번에 한 줄씩 또는 한 번에 한 함수 씩 실행하여 올바르게 작동하지 않는 위치를 확인하십시오. 또는 코드를 통해 적절한 추측을하고 로깅 문을 분산 시키십시오.


2
이. console.log('something')함수에 많은 문을 추가하여 어떤 문이 호출되고 있는지 확인합니다.
Gareth

1
프로그램은 거대하므로 프로그램이 올바르게 실행 된시기와 실행되지 않은시기에 대한 함수 로그를 비교할 방법을 찾고 있습니다.
amccormack 2011 년

1
나는 이것이 유용 할 것이라고 동의한다. 나는 대규모 코드베이스의 소유권을 얻기 위해 개입하고 있으며 모든 함수 호출의 실행 추적을 생성 할 수있는 무언가는 확실히 코드의 흐름 / 모양을 파악하고 죽은 코드를 감지하는 데 도움이 될 것입니다.
Matthew Nichols 2011 년

1

이 시도:

console.trace()

모든 브라우저에서 지원되는지 모르겠 기 때문에 먼저 존재하는지 확인하겠습니다.

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