2017-03-24 86 views
0

我在調試導致堆棧跟蹤丟失的問題。我想在nextTick之內登錄。如何登錄nextTick?

const _nextTick = process.nextTick; 

process.nextTick = function (callback) { 
    process.stdout.write('bar'); 

    const args = Array.prototype.slice.call(arguments); 

    return _nextTick.apply(this, args); 
}; 

console.log('foo'); 

但是,這會導致Maximum call stack size exceeded錯誤。

RangeError: Maximum call stack size exceeded 
    at process.nextTick (/Users/gajus/Documents/dev/applaudience/showtime-api/test.js:4:10) 
    at onwrite (_stream_writable.js:372:15) 
    at WriteStream.Socket._writeGeneric (net.js:727:5) 
    at WriteStream.Socket._write (net.js:737:8) 
    at doWrite (_stream_writable.js:329:12) 
    at writeOrBuffer (_stream_writable.js:315:5) 
    at WriteStream.Writable.write (_stream_writable.js:241:11) 
    at WriteStream.Socket.write (net.js:664:40) 
    at process.nextTick (/Users/gajus/Documents/dev/applaudience/showtime-api/test.js:4:18) 
    at onwrite (_stream_writable.js:372:15) 

看來,_stream_writable.js使用nextTick內部,這是造成一個無限循環:

foo 
barbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbarbar/Users/gajus/Documents/dev/applaudience/showtime-api/test.js:4 
    process.stdout.write('bar'); 

有什麼比process.stdout.write較低的水平,可用於從nextTick內登錄的消息?

+0

你不能全局替換'.nextTick()'用別的東西,並期望廣泛的使用它仍然正常運行的代碼。這不是解決你想解決的任何問題的好方法。如果你想要一個可以使用該日誌的nextTick版本,那麼創建你自己的函數來記錄並調用nextTick,並在你的代碼中使用這個新函數。不要更換系統的下一個標籤。 – jfriend00

+0

替代'nextTick'(包括''process'和事件處理程序)捕獲長堆棧跟蹤是捕獲異步操作的堆棧跟蹤的標準(唯一)方法。請參閱https://github.com/mattinsler/longjohn以供參考。 – Gajus

回答

0

我能想到的唯一解決方案是創建一個數組,用於跟蹤我想記錄的消息,並以設定的時間間隔將它們發送到stdout

const _nextTick = process.nextTick; 

let logs = []; 
let intervalSeen = false; 

process.nextTick = function (callback) { 
    if (intervalSeen) { 
    logs = []; 

    intervalSeen = false; 
    } 

    logs.push('bar'); 

    const args = Array.prototype.slice.call(arguments); 

    return _nextTick.apply(this, args); 
}; 

setInterval(() => { 
    intervalSeen = true; 

    console.log(logs); 
}, 500) 

console.log('foo'); 
0

試試這個請:

var fs = require('fs') 
const _nextTick = process.nextTick; 
var stream = fs.createWriteStream('blah', {fd: 1}) 

process.nextTick = function (callback) { 
    stream.write('bar') 
    const args = Array.prototype.slice.call(arguments) 
    return _nextTick.apply(this, args) 
} 
console.log('foo')