Нет имен функций при использовании DTrace в программе Node.js

Я пытаюсь использовать DTrace для профилирования ЦП программы Node.js в соответствии с это руководство на виртуальной машине OmniOS в VirtualBox, которую я настроил, выполнив эти шаги точно (за исключением использования узла 0.10.26).

К сожалению, DTrace не дает мне удобочитаемых имен функций JS, а только необработанные адреса функций (насколько я понимаю), что выглядит так и не очень полезно:

CPU     ID                    FUNCTION:NAME
  0  66407                        :tick-30s 


              node`v8::internal::String::ComputeHashField(unibrow::CharacterStream*, int, unsigned int)+0x162
              node`v8::internal::Utf8SymbolKey::Hash() [clone .part.342]+0xb9
              node`v8::internal::HashTable<v8::internal::SymbolTableShape, v8::internal::HashTableKey*>::FindEntry(v8::internal::Isolate*, v8::internal::HashTableKey*)+0x20
              node`v8::internal::SymbolTable::LookupKey(v8::internal::HashTableKey*, v8::internal::Object**)+0x38
              node`v8::internal::SymbolTable::LookupSymbol(v8::internal::Vector<char const>, v8::internal::Object**)+0x4e
              node`v8::internal::Heap::LookupSymbol(v8::internal::Vector<char const>)+0x34
              node`v8::internal::Factory::LookupSymbol(v8::internal::Vector<char const>)+0x34
              node`v8::internal::JSProxy::CallTrap(char const*, v8::internal::Handle<v8::internal::Object>, int, v8::internal::Handle<v8::internal::Object>*)+0x76
              node`v8::internal::JSProxy::GetPropertyWithHandler(v8::internal::Object*, v8::internal::String*)+0x108
              node`v8::internal::Object::GetProperty(v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, v8::internal::LookupResult*, v8::internal::Handle<v8::internal::String>, PropertyAttributes*)+0x57
              node`v8::internal::LoadIC::Load(v8::internal::InlineCacheState, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::String>)+0x49d
              node`v8::internal::LoadIC_Miss(v8::internal::Arguments, v8::internal::Isolate*)+0xbd
              0xa730a376
              0x8966eee0
              0x8968bb7c
              0xa7321899
              0xa731308a

Приведенное выше является результатом выполнения этих команд:

dtrace -n 'profile-97/pid == 12345 && arg1/{ @[jstack(150, 8000)] = count(); } tick-30s { exit(0); }' > stacks.out
gc++filt < stacks.out > demangled.out

У меня нет опыта работы с DTrace, но из того, что я до сих пор собрал, можно сказать, что ustack от Node helper должен преобразовать эти адреса в читаемые имена. Этот функционал должен быть включен при сборке Node с флагом --with-dtrace (что я и сделал), но, видимо, у меня он не работает.

Практически тот же самый вопрос был заданным ранее, но принятый ответ не помог в моем случае, так как я использовал --dest-cpu=x64 в любом случае (также пробовал --dest-cpu=ia32 просто для уверенности, но это не имело никакого значения).


person d0gb3r7    schedule 24.05.2014    source источник
comment
Можете ли вы также опубликовать команду dtrace, которую вы используете?   -  person Farid Nouri Neshat    schedule 25.05.2014
comment
@FaridNouriNeshat Конечно, добавил команды к вопросу.   -  person d0gb3r7    schedule 25.05.2014


Ответы (1)


Выяснил это благодаря отличному сообщению о node.js+DTrace на FreeBSD. Запуск Node с флагом DTRACE_DOF_INIT_DEBUG приводил к сообщению, подозрительно похожему на упомянутое в статье:

dtrace DOF: DTrace ioctl failed for DOF at cd5240 in /usr/local/bin/node: Arg list too long
dtrace DOF: DTrace ioctl succeeded for DOF at 1397e70 in /usr/local/bin/node

Несмотря на то, что статья посвящена FreeBSD, соответствующая часть исходного кода DTrace (dtrace_dof_copyin в dtrace.c) практически идентична (см. contrib/opensolaris/uts/common/dtrace/dtrace.c#L11989" rel="nofollow">исходный код FreeBSD против исходный код OmniOS). Следовательно, в моем случае похоже, что помощник Node ustack также превышает ограничение размера для объектов DOF/DTrace, хотя этот предел установлен на 8 МБ в OmniOS, в отличие от 256 КБ во FreeBSD.

Чтобы проверить это предположение, я попробовал ту же самую процедуру с Node v0.10.5 вместо v0.10.26, так как это была версия, которая, по-видимому, работала как минимум 3 человека раньше, и в моем случае это тоже сработало; запуск Node с вышеупомянутым флагом выводит:

dtrace DOF: DTrace ioctl succeeded for DOF at cd6c88 in /usr/local/bin/node
dtrace DOF: DTrace ioctl succeeded for DOF at d122c8 in /usr/local/bin/node

И имена функций JS появляются в выводе DTrace, как и ожидалось.

EDIT: Node v0.10.20 — самая последняя версия, в которой он работает.

person d0gb3r7    schedule 25.05.2014