gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:37:33 25 4
gpt4 key购买 nike

我正在尝试根据 this guide 使用 DTrace 对 Node.js 程序进行 CPU 分析。在 VirtualBox 中的 OmniOS VM 上,我按照 these steps 设置了该 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

以上是运行这些命令的结果:

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 helper应该将这些地址转换为可读的名称。在使用 --with-dtrace 标志构建 Node 时应该启用此功能(我就是这样做的),但显然它对我不起作用。

几乎完全相同的问题实际上是 asked before ,但是那里接受的答案对我的情况没有帮助,因为我无论如何都在使用 --dest-cpu=x64 (也尝试了 --dest-cpu=ia32 只是当然,但这没有任何区别)。

最佳答案

弄清楚了,感谢这篇关于 node.js+DTrace on 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 sourceOmniOS source )。因此,在我的例子中,Node ustack 帮助程序也超出了 DOF/DTrace 对象的大小限制,即使该限制在 OmniOS 中设置为 8 mb,而不是 FreeBSD 中的 256 kb

为了验证这个假设,我用 Node v0.10.5 而不是 v0.10.26 尝试了完全相同的过程,因为那个版本显然之前至少在 3 people 上有效,而且它在我的例子中也起到了作用;使用上述标志打印启动 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 输出中。

编辑:Node v0.10.20 是可以运行的最新版本。

关于javascript - 在 Node.js 程序上使用 DTrace 时没有函数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23848979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com