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

Javascript 在Node.js程序上使用DTrace时没有函数名,javascript,node.js,profiling,dtrace,omnios,Javascript,Node.js,Profiling,Dtrace,Omnios,我正试图使用DTrace对Node.js程序进行CPU评测,根据VirtualBox中的OmniOS VM,我完全按照下面的设置进行了设置(除了使用Node 0.10.26) 不幸的是,DTrace没有给我人类可读的JS函数名,而只是原始函数地址(据我所知),这看起来像这样,并不是很有帮助: CPU ID FUNCTION:NAME 0 66407 :tick-30s

我正试图使用DTrace对Node.js程序进行CPU评测,根据VirtualBox中的OmniOS VM,我完全按照下面的设置进行了设置(除了使用Node 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
CPU ID函数:名称
0 66407:tick-30s
节点`v8::internal::String::ComputeHashField(unibrow::CharacterStream*,int,unsigned int)+0x162
节点`v8::internal::Utf8SymbolKey::Hash()[clone.part.342]+0xb9
节点`v8::internal::HashTable::FindEntry(v8::internal::Isolate*,v8::internal::HashTableKey*)+0x20
节点`v8::internal::SymbolTable::LookupKey(v8::internal::HashTableKey*,v8::internal::Object**)+0x38
节点`v8::internal::SymbolTable::LookupSymbol(v8::internal::Vector,v8::internal::Object**)+0x4e
节点`v8::internal::Heap::LookupSymbol(v8::internal::Vector)+0x34
节点`v8::internal::Factory::LookupSymbol(v8::internal::Vector)+0x34
节点`v8::internal::JSProxy::CallTrap(char const*,v8::internal::Handle,int,v8::internal::Handle*)+0x76
节点`v8::internal::JSProxy::GetPropertyWithHandler(v8::internal::Object*,v8::internal::String*)+0x108
节点`v8::internal::Object::GetProperty(v8::internal::Handle,v8::internal::Handle,v8::internal::LookupResult*,v8::internal::Handle,PropertyAttributes*)+0x57
节点`v8::internal::LoadIC::Load(v8::internal::InlineCacheState,v8::internal::Handle,v8::internal::Handle)+0x49d
节点`v8::internal::LoadIC_Miss(v8::internal::Arguments,v8::internal::Isolate*)+0xbd
0xa730a376
0x8966eee0
0x8968bb7c
0xA732899
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-n'profile-97/pid==12345&&arg1/{[jstack(1508000)]=count();}tick-30s{exit(0);}>stacks.out
gc++过滤器demangled.out
我以前没有使用DTrace的经验,但根据我目前收集的信息,Node应该将这些地址转换成可读的名称。当使用dtrace标记(我这样做了)构建节点时,应该启用此功能,但显然它对我不起作用


事实上,几乎完全相同的问题一直存在,但被接受的答案对我的情况没有帮助,因为我一直在使用
--dest cpu=x64
(为了确定起见,我也尝试了
--dest cpu=ia32
,但这没有任何区别)。

由于这篇关于的精彩文章,我找到了答案。使用
DTRACE\u DOF\u INIT\u 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.c
中的
DTrace\u dof\u copyin
)几乎是相同的(参见vs.)。因此,在我的例子中,节点ustack辅助对象也超出了DOFs/DTrace对象的大小限制,尽管该限制在OmniOS中设置为,而在FreeBSD中设置为

为了验证这一假设,我尝试了与节点v0.10.5完全相同的过程,而不是v0.10.26,因为这是至少在以前工作过的版本,在我的例子中它也起到了作用;具有上述标志的起始节点打印:

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输出中


编辑:Node v0.10.20是最新版本。能否发布正在运行的dtrace命令?@FaridNouriNeshat当然,已将命令添加到问题中。