我正在使用dtrace来对这样的进程的堆栈跟踪进行采样:
# /usr/sbin/dtrace -p $MYPID -x ustackframes=100 stack.d -s -o stack.log
stack.d
的样子:
profile-99
/execname == "mybinary"/
{
@[execname, ustack()] = count();
}
我正在向-p
添加dtrace
,这样即使用户进程已经退出,它也会在堆栈写入期间显示符号。
这有效 - 但我发现了3个问题:
在跟踪期间,我会定期收到错误消息,例如:
dtrace: error on enabled probe ID 1 (ID 12345: profile:::profile-99):\
invalid address (0x0) in action #3
dtrace: error on enabled probe ID 1 (ID 12345: profile:::profile-99):\
invalid address (0xffffffff00000000) in action #3
dtrace: error on enabled probe ID 1 (ID 12345: profile:::profile-99):\
invalid address (0x7ffe8000) in action #3
[..]
(即许多人)
那里的根本问题是什么?
该过程执行得如此(即没有崩溃)。
另一件事是很多记录的堆栈根本不包含任何符号。
这种无符号堆栈的可能原因是什么?
此外 - 某些堆栈不以_start -> main
开头,但仍包含符号(即包含二进制函数)。
那些不完整的堆栈是dtrace以某种方式无法到达底部的吗?