使用 --call-stack fp 进行性能记录无法展开主函数

nnn*_*mmm 1 c++ glibc libc stack-unwinding perf

我有一个 C++ 测试程序,可以让 CPU 保持忙碌:

\n
#include <cstdint>\n#include <iostream>\n\n// Linear-feedback shift register\nuint64_t lfsr1(uint64_t max_ix)\n{\n    uint64_t start_state = 0xACE1u;  /* Any nonzero start state will work. */\n    uint64_t lfsr = start_state;\n    uint64_t bit;                    /* Must be 16-bit to allow bit<<15 later in the code */\n\n    for (uint64_t ix = 0; ix < max_ix; ++ix)\n    {   /* taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1 */\n        bit = ((lfsr >> 0) ^ (lfsr >> 1) ^ (lfsr >> 3) ^ (lfsr >> 4)) & 1 /* & 1u */;\n        lfsr = (lfsr >> 1) | (bit << 15);\n    }\n    return lfsr;\n}\n\nint main() {\n    std::cout << lfsr1(1717986914ull) << "\\n";\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我用 编译它,然后用和 第二次g++ -g -O3 -fno-omit-frame-pointer cpu.cpp -o cpu.bin运行它,而不是perf record -F 100 --call-graph fp -- ./cpu.bindwarffp.

\n

perf script输出中fp, I can see

\n
cpu.bin 23435 1535437.021156:   42706947 cycles: \n            5617daf4b7a1 main+0x31 (\xe2\x80\xa6/cpu.bin)\n            7f9a95088bf7 __libc_start_main+0xe7 (/lib/x86_64-linux-gnu/libc-2.27.so)\n         3fe258d4c544155 [unknown] ([unknown])\n
Run Code Online (Sandbox Code Playgroud)\n

而对于dwarf, it's

\n
cpu.bin 23443 1535441.101859:   42952079 cycles: \n            55a3b4ffd7a1 lfsr1+0x31 (inlined)\n            55a3b4ffd7a1 main+0x31 (\xe2\x80\xa6/cpu.bin)\n            7f00bcc8ebf6 __libc_start_main+0xe6 (/lib/x86_64-linux-gnu/libc-2.27.so)\n            55a3b4ffd829 _start+0x29 (\xe2\x80\xa6/cpu.bin)\n
Run Code Online (Sandbox Code Playgroud)\n

看起来可能fp有一个字节的偏差__libc_start_main and that causes it to miss the last unwind step. How can this be fixed?

\n

nnn*_*mmm 5

正如 Peter 在评论中所说,当使用带有帧指针的 glibc 版本时,问题会自行解决。在Ubuntu 20.04上,有一个带有这样的glibc的包。

\n
sudo apt install libc6-prof\n# To use this library:\nenv LD_LIBRARY_PATH=/lib/libc6-prof/x86_64-linux-gnu perf record \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n

然后,问题[unknown]就按预期解决了_start

\n

来源:https ://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1908307

\n