使用密件抄送工具的配置文件,我在 C 程序的配置文件输出中得到的主要是“[未知]”。当然,这是意料之中的,因为未加载程序符号。但是,我不确定如何正确加载符号,以便“配置文件”程序可以获取它。我已经使用启用调试的“-g”构建了我的程序,但是如何将调试符号加载到“配置文件”?
问问题
194 次
1 回答
0
请参阅密件抄送配置文件手册页中的调试部分:
看到带有虚假地址的“[未知]”帧?这可能由于不同的原因而发生。最好的方法是先让 Linux perf 工作,然后再尝试这个工具。例如,“perf record -F 49 -a -g -- sleep 1; perf script”,并在那里检查未知帧。
“[unknown]”帧最常见的原因是目标软件没有使用帧指针编译,因此我们不能使用这种简单的方法来遍历堆栈。在这种情况下,解决方法是使用具有帧指针的软件,例如 gcc -fno-omit-frame-pointer 或 Java 的 -XX:+PreserveFramePointer。
“[未知]”帧的另一个原因是 JIT 编译器,它不使用传统的符号表。在这种情况下,解决方法是使用该工具应读取的符号填充 /tmp/perf-PID.map 文件。如何执行此操作取决于运行时(Java、Node.js)。
如果您似乎在输出中有不相关的样本,请检查可能正在运行的其他采样或跟踪工具。如果分析同时发生,则此工具的当前版本可以包含它们的事件。这些样本可能会在未来的版本中被过滤。
在您的情况下,由于它是 C 程序,我建议使用-fno-omit-frame-pointer
.
于 2020-07-22T08:51:27.227 回答