Fork me on GitHub

عیب‌یابی برنامه‌های node.js

گاهی اوقات زمانی که صرف عیب‌یابی یا debug کردن برنامه‌ها می‌شه از زمانی که صرف تولیدشون می‌شه بیشتره. از این رو همیشه برنامه‌نویس‌ها به فکر تولید ابزارها و استفاده از روش‌هایی هستند که کار عیب‌یابی رو تسهیل و تسریع کنه.

node.js هم از این قاعده مستثنی نیست و اگر ‌می‌خواهید زمان کمتری رو صرف عیب‌یابی برنامه‌هاتون بکنید باید از روش‌ها و ابزارهای مناسب استفاده کنید که در ادامه به بررسی اونها می‌پردازیم.

استفاده از console.log()‎

ساده‌ترین و پرکاربردترین روش برای عیب‌یابی برنامه‌های node.js استفاده از console.log()‎ هست.

این دستور محتوای پارامترهای دریافتی رو در خروجی(stdout) نمایش می‌ده:

var myobj = {key: 'value'};
var myvar = 'Hello';
console
.log(myobj, myvar);

همچنین می‌تونید از این دستور مشابه sprintf هم استفاده کنید:

var myobj = {key: 'value'};
console
.log('Hello %s, this is my object: %j', 'World', myobj);

استفاده از console.trace()‎

با استفاده از دستور console.trace()‍‍‍‎ می‌تونید stack trace برنامه رو روی خروجی(stderr) ببینید. به عبارتی می‌تونید ببینید که node برای رسیدن به یک نقطه خاص از برنامه چه مسیری رو طی کرده.

اندازه گیری زمان اجرا

اندازه گیری زمان اجرای بخش های مختلف برنامه توی پیدا کردن bottleneck ها خیلی کمک می‌کنه. برای این منظور می‌تونید از console.time()‎ استفاده کنید. برای مثال می‌تونید زمان اجرای یک query رو به این شکل اندازه بگیرید:

console.time('myquery');
db
.query('SELECT * FROM mytable', function() {
    console
.timeEnd('myquery');
});

استفاده از debugger ند

گاهی اوقات برای پیدا کردن اشکالات در برنامه‌های پیچیده‌تر احتیاج به debugger ی هست که قابلیت‌هایی نظیر breakpoint و watch و ... داشته باشه.
همونطور که می‌دونید node.js از موتور جاوااسکریپت کروم (v8) استفاده می‌کنه و خوشبختانه این موتور مجهز به debugger پیشرفته ای هست که از طریق یک پروتکل ساده TCP کار می‌کنه.

یک رابط دستوری برای استفاده از این debugger در ند تعبیه شده. برای استفاده از این رابط باید ند رو با پارامتر debug اجرا کنید:

$ node debug myscript.js

با استفاده از این پارامتر برنامه وارد محیط دستوری debugger می‌شه. مثلا با استفاده از دستور cont می‌تونید اجرای برنامه رو ادامه بدید.
اگر بخواهید که اجرای برنامه توی خط خاصی متوقف بشه باید توی برنامه از دستور debugger;‎ استفاده کنید.

برای دیدن لیست دستورات در محیط دستوری debugger از help استفاده کنید.

البته دستورات این debugger محدوده و debug کردن برنامه به صورت دستوری هم کار مشکلیه. بنابراین برای استفاده از تمام امکانات debugger موتور V8 احتیاج به یک رابط کاربری پیشرفته تر با محیط گرافیکی داریم.

استفاده از node-inspector

node-inspector یک رابط برای debugger ند هست که از WebKit Web Inspector استفاده می‌کنه. بنابراین برای استفاده از اون احتیاج به یک مرورگر بر پایه WebKit مثل Chrome و یا Safari دارید.

برای نصب node-inspector از دستور زیر استفاده کنید:

$ sudo npm install -g node-inspector

اگر بخواهید برنامه رو با رابطی غیر از رابط دستوری ند debug کنید باید از پارامتر ‎--debug استفاده کنید:

$ node --debug myscript.js

و اگر بخواهید اجرای برنامه در اولین خط متوقف بشه از پارامتر ‎--debug-brk استفاده کنید:

$ node --debug-brk myscript.js

حالا در یک terminal دیگه node-inspector رو اجرا کنید:

$ node-inspector

حالا برای استفاده از debugger باید آدرس http://0.0.0.0:8080/debug?port=5858 رو در یک مرورگر بر پایه WebKit مثل Chrome باز کنید. اگر قبلا با Chrome برنامه‌های JavaScript سمت کلاینت رو debug کرده باشید با این محیط آشنایی دارید.

می‌تونید روی نقاط مختلف برنامه breakpoint تعریف کنید، اجرای برنامه رو به صورت خط به خط دنبال کنید، مقادیر متغییرها رو ببینید، متغییرها رو ویرایش کنید و حتی با double click بر روی خطوط برنامه می‌تونید در حین اجرا برنامه رو تغییر بدید و تست کنید.

حتی با این debugger می‌تونید برنامه‌های روی سرور رو از راه دور debug کنید. برای این کار باید node-inspector رو روی سرور اجرا کنید و مطمئن بشید که به پورت 8080 دسترسی دارید.