Поиск по блогу

понедельник, 25 мая 2015 г.

Nodejs. Смотрю видео, запоминаю три приема с debugger, а проба node-inspector в комментариях

И все это на машине с Kali (Debian). Очередная попытка установить софт "между делом" не прошла. Дело: смотрю видео (от Кантора) дабы освоить дебаггер, тупо устанавливаю node-inspector, а он сообщает мне, что не находит Chrome, действительно, нет на этой машине ни одного вебкита.
Между делом:Нахожу в инете мануал How to Install Google Chrome in Kali Linux, но оказывается, что дело это хлопотное... Спрашивается, зачем я это сделал? Думать было некогда!

DebuggerProtocol
How to Install Google Chrome in Kali Linux? – Part 3 – Running Chrome

Три приема c debugger:
1. Вставить в код debugger, запустить скрипт >node debug myscript.js
2. Запустить скрипт >node --debug-brk myscript.js - сразу в режиме отладки
3. >repl - вход в интерактивную консоль, все объекты там...

debugger Node.js v0.12.4 Manual & Documentation
Read-Eval-Print-Loop (REPL) - Read-Eval-Print-Loop (REPL) is available both as a standalone program and easily includable in other programs. The REPL provides a way to interactively run JavaScript and see the results. It can be used for debugging, testing, or just trying things out.

Как работать с debugger

Сначала входим в режим отладки (см выше... первый прием самый простой). Здесь работает все (как в Python), но посмотреть объекты нельзя. Поэтому в нужном месте входим в режим repl - это по сути интерактивная консоль, в которую передаются все объекты:

In [ ]:
# дебаггер 
debug> o
break in r1.js:18
 16     }
 17 });
 18 });
debug> list(9)
  9         $('a.title', '#siteTable').each(function(){
 10             var url = this.href;
 11             urls.push(url);
 12             debugger;  
 13         });
 14         console.log(urls.length);
 15             console.log(urls);
 16     }
 17 });
 18 });
In [ ]:
debug> repl
Press Ctrl + C to leave debug repl
> 1+1
2
> request.
request.__defineGetter__      request.__defineSetter__
request.__lookupGetter__      request.__lookupSetter__
request.constructor           request.hasOwnProperty
request.isPrototypeOf         request.propertyIsEnumerable
request.toLocaleString        request.toString
request.valueOf

request - это один из объектов, который был вызван при выполнении скрипта. После request. ннажимаем на клавишу Tab Также можно использовать вот такие необычные команды:

In [ ]:
> .
.break  .clear  .exit   .help   .load   .save   

> .help
.break Sometimes you get stuck, this gets you out
.clear Break, and also clear the local context
.exit Exit the repl
.help Show repl options
.load Load JS from a file into the REPL session
.save Save all evaluated commands in this REPL session to a file
> 

Далее можно не читать. Я здесь сохранил мои ошибочные действия - не надо было "хвататься" за установку второго более мощного дебаггера. Надо было сначала подумать. Ведь не бывает дебаггеров без доступа к Heap. А я последовал за автором видео...

Сначала попробуем встроеный дебаггер

В код надо вставить волшебное слово debugger; и в консоли при запуске надо вставить не менее волшебнос слово debug

In [ ]:
kiss@kali:~/Desktop/scr$ node debug r1.js
< debugger listening on port 5858
connecting... ok
break in r1.js:1
  1 var request = require('request'),
  2     cheerio = require('cheerio'),
  3     urls = [];
debug> help
Commands: run (r), cont (c), next (n), step (s), out (o), backtrace (bt), setBreakpoint (sb), clearBreakpoint (cb),
watch, unwatch, watchers, repl, restart, kill, list, scripts, breakOnException, breakpoints, version
debug> list
[Function]
debug> version
3.14.5.9
debug> 
(^C again to quit)
debug> 
kiss@kali:~/Desktop/scr$ 

При попытке найти подсказки (клавиша Tab) ничего не получилось, распечатать часть кода тоже не получилось... Так что пробуем поставить агрегат помощнее node-inspector. Процесс установки в приложении в конце поста.

In [ ]:
 node --debug-brk r1.js
debugger listening on port 5858
repl
help
GET / HTTP/1.1: (no value)
Host: 127.0.0.1:5858
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Firefox/31.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: OAID=3203b4266a1020a4c0fccff78568de90; OACBLOCK=2.1431012323; OACCAP=2
Connection: keep-alive
GET /favicon.ico HTTP/1.1: (no value)
Host: 127.0.0.1:5858
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Firefox/31.0
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: OAID=3203b4266a1020a4c0fccff78568de90; OACBLOCK=2.1431012323; OACCAP=2
Connection: keep-alive
GET /favicon.ico HTTP/1.1: (no value)
Host: 127.0.0.1:5858
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Firefox/31.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cookie: OAID=3203b4266a1020a4c0fccff78568de90; OACBLOCK=2.1431012323; OACCAP=2
Connection: keep-alive

У меня скрипт не создает сервер, который слушает определенный порт, или выводит эхо-сообщения, как в видео, или, как в документации... Потому пока ограничусь первым знакомстовом с дебаггером.

Приложение Устновка дебаггера (от Гугла) node-inspector глобально

In [ ]:
root@kali:/home/kiss# npm i -g node-inspector
 
> v8-profiler@5.2.9 preinstall /usr/local/lib/node_modules/node-inspector/node_modules/v8-profiler
>  

 
> v8-debug@0.4.6 preinstall /usr/local/lib/node_modules/node-inspector/node_modules/v8-debug
>  

npm WARN optional dep failed, continuing default-browser-id@1.0.2
 
> bufferutil@1.1.0 install /usr/local/lib/node_modules/node-inspector/node_modules/ws/node_modules/bufferutil
> node-gyp rebuild

make: Entering directory `/usr/local/lib/node_modules/node-inspector/node_modules/ws/node_modules/bufferutil/build'
  CXX(target) Release/obj.target/bufferutil/src/bufferutil.o
  SOLINK_MODULE(target) Release/obj.target/bufferutil.node
  SOLINK_MODULE(target) Release/obj.target/bufferutil.node: Finished
  COPY Release/bufferutil.node
make: Leaving directory `/usr/local/lib/node_modules/node-inspector/node_modules/ws/node_modules/bufferutil/build'

> utf-8-validate@1.1.0 install /usr/local/lib/node_modules/node-inspector/node_modules/ws/node_modules/utf-8-validate
> node-gyp rebuild

make: Entering directory `/usr/local/lib/node_modules/node-inspector/node_modules/ws/node_modules/utf-8-validate/build'
  CXX(target) Release/obj.target/validation/src/validation.o
  SOLINK_MODULE(target) Release/obj.target/validation.node
  SOLINK_MODULE(target) Release/obj.target/validation.node: Finished
  COPY Release/validation.node
make: Leaving directory `/usr/local/lib/node_modules/node-inspector/node_modules/ws/node_modules/utf-8-validate/build'

> v8-profiler@5.2.9 install /usr/local/lib/node_modules/node-inspector/node_modules/v8-profiler
> node-pre-gyp install --fallback-to-build

make: Entering directory `/usr/local/lib/node_modules/node-inspector/node_modules/v8-profiler/build'
  CXX(target) Release/obj.target/profiler/src/profiler.o
  CXX(target) Release/obj.target/profiler/src/cpu_profiler.o
../src/cpu_profiler.cc: In static member function static v8::Handle<v8::Value> nodex::CpuProfiler::StartProfiling(const v8::Arguments&):
../src/cpu_profiler.cc:32:10: warning: variable recsamples set but not used [-Wunused-but-set-variable]
  CXX(target) Release/obj.target/profiler/src/cpu_profile.o
  CXX(target) Release/obj.target/profiler/src/cpu_profile_node.o
  CXX(target) Release/obj.target/profiler/src/heap_profiler.o
  CXX(target) Release/obj.target/profiler/src/heap_snapshot.o
  CXX(target) Release/obj.target/profiler/src/heap_output_stream.o
  CXX(target) Release/obj.target/profiler/src/heap_graph_node.o
  CXX(target) Release/obj.target/profiler/src/heap_graph_edge.o
  SOLINK_MODULE(target) Release/obj.target/profiler.node
  SOLINK_MODULE(target) Release/obj.target/profiler.node: Finished
  COPY Release/profiler.node
  COPY /usr/local/lib/node_modules/node-inspector/node_modules/v8-profiler/build/profiler/v5.2.9/node-v11-linux-ia32/profiler.node
  TOUCH Release/obj.target/action_after_build.stamp
make: Leaving directory `/usr/local/lib/node_modules/node-inspector/node_modules/v8-profiler/build'

> v8-debug@0.4.6 install /usr/local/lib/node_modules/node-inspector/node_modules/v8-debug
> node-pre-gyp install --fallback-to-build

make: Entering directory `/usr/local/lib/node_modules/node-inspector/node_modules/v8-debug/build'
  CXX(target) Release/obj.target/debug/src/debug.o
../src/debug.cc: In static member function static v8::Handle<v8::Value> nodex::Debug::InternalConstructorName(const v8::Arguments&):
../src/debug.cc:194:25: warning: deprecated conversion from string constant to char*’ [-Wwrite-strings]
  SOLINK_MODULE(target) Release/obj.target/debug.node
  SOLINK_MODULE(target) Release/obj.target/debug.node: Finished
  COPY Release/debug.node
  COPY /usr/local/lib/node_modules/node-inspector/node_modules/v8-debug/build/debug/v0.4.6/node-v11-linux-ia32/debug.node
  TOUCH Release/obj.target/action_after_build.stamp
make: Leaving directory `/usr/local/lib/node_modules/node-inspector/node_modules/v8-debug/build'
/usr/local/bin/node-inspector -> /usr/local/lib/node_modules/node-inspector/bin/inspector.js
/usr/local/bin/node-debug -> /usr/local/lib/node_modules/node-inspector/bin/node-debug.js
node-inspector@0.10.1 /usr/local/lib/node_modules/node-inspector
├── async@0.9.2
├── semver@4.3.4
├── debug@2.2.0 (ms@0.7.1)
├── rc@1.0.3 (strip-json-comments@0.1.3, deep-extend@0.2.11, ini@1.3.3, minimist@0.0.10)
├── strong-data-uri@1.0.0 (truncate@1.0.4)
├── serve-favicon@2.2.1 (fresh@0.2.4, ms@0.7.1, parseurl@1.3.0, etag@1.6.0)
├── glob@5.0.9 (path-is-absolute@1.0.0, inherits@2.0.1, once@1.3.2, inflight@1.0.4, minimatch@2.0.8)
├── yargs@3.9.1 (decamelize@1.0.0, camelcase@1.1.0, window-size@0.1.0, cliui@2.1.0)
├── which@1.1.1 (is-absolute@0.1.7)
├── express@4.12.4 (merge-descriptors@1.0.0, fresh@0.2.4, utils-merge@1.0.0, cookie-signature@1.0.6, methods@1.1.1, cookie@0.1.2, escape-html@1.0.1, range-parser@1.0.2, parseurl@1.3.0, content-type@1.0.1, finalhandler@0.3.6, vary@1.0.0, serve-static@1.9.3, content-disposition@0.5.0, path-to-regexp@0.1.3, depd@1.0.1, qs@2.4.2, on-finished@2.2.1, proxy-addr@1.0.8, etag@1.6.0, send@0.12.3, type-is@1.6.2, accepts@1.2.7)
├── biased-opener@0.2.5 (opener@1.4.1, minimist@1.1.0, x-default-browser@0.3.0, browser-launcher2@0.4.5)
├── ws@0.7.2 (options@0.0.6, ultron@1.0.1, bufferutil@1.1.0, utf-8-validate@1.1.0)
├── v8-profiler@5.2.9 (nan@1.8.4, node-pre-gyp@0.6.7)
└── v8-debug@0.4.6 (nan@1.8.4, node-pre-gyp@0.6.7)
root@kali:/home/kiss# 


Посты чуть ниже также могут вас заинтересовать

3 комментария:

  1. После установки Chrome все работает (Kali).

    1.набираем в консоли
    node-inspector
    2. Идем по указанному адресу
    http://127.0.0.1:8080/debug?ws=127.0.0.1:8080&port=5858

    и там прибамбасов... для полного счастья

    ОтветитьУдалить
    Ответы
    1. А пере этим запускаем
      node --debug r01.js

      и код должен отразиться в дебаггере...

      Удалить
    2. Да не тут-то было, все "включалось", но chrome не видел файл с кодом...

      Надо было использовать --debug-brk
      node --debug-brk r01.js
      node-inspector (в новой консоли)
      http://127.0.0.1:8080/debug?ws=127.0.0.1:8080&port=5858


      http://stackoverflow.com/questions/23340968/debugging-node-js-with-node-inspector

      Try to run node --debug-brk app.js instead of just --debug. Your application may not be pausing before node inspector hooks into the node process. Using --debug-brk will force node to break on the first line of your app and wait for a debugger to attach to the process. Loading the node-inspector web interface is what causes node-inspector to attach to your node process; that's why you include the node debug port in the query string (localhost:8080/debug?port=5858). You're telling node-inspector what port it should reach out and attach to.

      Удалить