繁体   English   中英

在Node.js程序上使用DTrace时没有函数名称

[英]No function names when using DTrace on Node.js program

我试图根据VirtualBox中OmniOS VM上的本指南 ,使用DTrace对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的ustack助手应该将这些地址转换为可读的名称。 当使用--with-dtrace标志构建Node时,应该启用此功能(我确实这样做了),但是显然它对我不起作用。

之前几乎已经问过完全相同的问题,但是在那里接受的答案对我的情况没有帮助,因为无论如何我都在使用--dest-cpu=x64 (为了确保也尝试了--dest-cpu=ia32 ,但没有任何区别)。

通过FreeBSD上有关node.js + DTrace的出色文章,找到了解决方案。 使用DTRACE_DOF_INIT_DEBUG标志启动Node导致的消息可疑地类似于本文中提到的消息:

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源OmniOS源 )。 因此,就我而言,Node ustack帮助器似乎也超过了DOF / DTrace对象的大小限制,即使该限制在OmniOS中设置为8 mb ,而在FreeBSD中则为256 kb

为了验证这一假设,我使用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输出中。

编辑 :节点v0.10.20是它工作的最新版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM