2012-07-08 26 views

Respuesta

77
Object.defineProperty(global, '__stack', { 
    get: function(){ 
    var orig = Error.prepareStackTrace; 
    Error.prepareStackTrace = function(_, stack){ return stack; }; 
    var err = new Error; 
    Error.captureStackTrace(err, arguments.callee); 
    var stack = err.stack; 
    Error.prepareStackTrace = orig; 
    return stack; 
    } 
}); 

Object.defineProperty(global, '__line', { 
    get: function(){ 
    return __stack[1].getLineNumber(); 
    } 
}); 

console.log(__line); 

Lo anterior se registrará 19.

Combinado con arguments.callee.caller puede acercarse al tipo de registro útil que obtiene en C a través de macros.

+3

https://code.google.com/p/v8/wiki/ JavaScriptStackTraceApi # Customizing_stack_traces tiene una lista de otros métodos disponibles en v8 StackTrace API. Una lista general: getThis, getTypeName, getFunctionName, getFinalName, getMethodName, GetFileName, getLineNumber, getColumnNumber, getEvalOrigin, isToplevel, isEval, isNative, isConstructor – zamnuts

+0

Consulte también esta respuesta para obtener un ejemplo de código para generar el seguimiento completo. http://stackoverflow.com/questions/6163807/customized-stack-traces-in-google-chrome-developer-tools/10942404#10942404 –

+0

Se puede ver un ejemplo de uso de esta API aquí: https://github.com /jameswomack/capn/blob/master/test/capn.js –

-2

al parecer esto también funciona en el nodo o el navegador Chrome (posiblemente otros también)

line = (o) -> 
    b = Error.prepareStackTrace 
    Error.prepareStackTrace = (_, stack) -> stack 
    e = new Error 
    Error.captureStackTrace e, o 
    s = e.stack 
    Error.prepareStackTrace = b 
    s[1].getLineNumber() 

console.log line this 

o:

lineNumber=(o)->E=Error;p='prepareStackTrace';b=E[p];E[p]=((_,s)->s);e=new E;E.captureStackTrace e,o;s=e.stack;E[p]=b;s[1].getLineNumber() 

console.log lineNumber this 
+1

Funciona en V8 (utilizado por Chrome y Node.js) uso como se menciona en el título de mi publicación. –

+8

Mike, creo que el OP estaba hablando de JavaScript –

Cuestiones relacionadas