我正在尝试使用DTrace根据this guide在VirtualBox中的OmniOS VM上对Node.js程序进行CPU分析,我在{{}}}之后完全设置(除了使用节点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的经验,但是到目前为止我收集的内容中,Node these steps应该将这些地址转换为可读的名称。在使用--with-dtrace
标志(我做过)构建Node时应该启用此功能,但显然它对我不起作用。
几乎完全相同的问题实际上是ustack helper,但是在我的情况下接受的答案没有帮助,因为我正在使用--dest-cpu=x64
(也尝试过--dest-cpu=ia32
当然,但这没有任何区别。)
答案 0 :(得分:0)
想出来,感谢这篇关于node.js+DTrace on FreeBSD的优秀帖子。使用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
)几乎完全相同(请参阅FreeBSD source与OmniOS source)。因此,看起来在我的情况下,Node ustack助手也超过了DOF / DTrace对象的大小限制,即使在OmniOS中将此限制设置为8 mb,而不是FreeBSD中的256 kb 。
为了验证这个假设,我尝试使用Node v0.10.5而不是v0.10.26完全相同的程序,因为那个版本之前显然至少工作过3 people,而且它也有诀窍我的情况;使用前面提到的标志打印节点:
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输出中。
编辑:节点v0.10.20是最新版本。