在Node.js程序上使用DTrace时没有函数名
No function names when using DTrace on Node.js program
我正在尝试使用DTrace对node .js程序进行CPU分析,根据本指南在VirtualBox中的OmniOS VM上,我完全按照这些步骤设置(除了使用节点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的usstack助手应该将这些地址转换为可读的名称。这个功能应该在使用--with-dtrace
标志构建Node时启用(我这样做了),但显然它不适合我。
几乎完全相同的问题实际上已经问过之前,但接受的答案在我的情况下没有帮助,因为我使用--dest-cpu=x64
无论如何(也尝试--dest-cpu=ia32
只是为了确定,但这并没有任何区别)。
找到了,感谢这篇关于node.js+DTrace在FreeBSD上的优秀文章。使用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.c
中的dtrace_dof_copyin
)几乎是相同的(参见FreeBSD源代码与OmniOS源代码)。因此,在我的例子中,看起来Node ustack helper也超过了dfs/DTrace对象的大小限制,尽管在OmniOS中该限制设置为8mb,而在FreeBSD中则为256kb。
为了验证这个假设,我在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是它工作的最新版本。
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 我可以在json对象中添加一个函数吗
- AngularJS:我可以跳过函数参数回调吗
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- jquery点击函数select&取消选择
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- Node.js v6.2.0类扩展不是函数错误
- 比较从函数和生成的日期对象
- jQuery中是否内置了任何字符串格式化函数
- 在Node.js程序上使用DTrace时没有函数名