Haswell LBR call stacks
Hey all,
Some time ago I read this interesting article:
http://article.gmane.org/gmane.linux.kernel/1809078
It mentions a new call stack unwinding for perf, based on Haswell LBR facility. I now have a new Laptop with a Broadwell i7-5600U CPU, but my perf version 4.0.3 running against a Linux 4.0.4 kernel (all vanilla Archlinux versions) does not seem to support this feature. Was it ever included in the mainline? Is a special compiler flag required to enable this feature? Anything else I'm missing?
callchain: Unknown --call-graph option value: lbr
usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]
--call-graph <mode[,dump_size]>
setup and enables call-graph (stack chain/backtrace)
recording: fp dwarf
Thanks
Signature · 3 lines
Milian Wolff [email protected] http://milianw.de
Re: Haswell LBR call stacks - broken
Quoted 13 lines · On Sunday 14 June 2015 13:02:57 Milian Wolff wrote:
Hey all,
Some time ago I read this interesting article:
http://article.gmane.org/gmane.linux.kernel/1809078
It mentions a new call stack unwinding for perf, based on Haswell LBR facility. I now have a new Laptop with a Broadwell i7-5600U CPU, but my perf version 4.0.3 running against a Linux 4.0.4 kernel (all vanilla Archlinux versions) does not seem to support this feature. Was it ever included in the mainline? Is a special compiler flag required to enable this feature? Anything else I'm missing?
Quoted 8 lines
callchain: Unknown --call-graph option value: lbr
usage: perf record [<options>] [<command>]
or: perf record [<options>] -- <command> [<options>]--call-graph <mode[,dump_size]>
setup and enables call-graph (stack
chain/backtrace) recording: fp dwarf
OK, with a more recent perf v4.2.rc5 on a Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz it actually works. Somewhat :) It is much faster, but the callstacks don't terminate properly, and are sometimes not correctly demangled. I observe the following behavior:
15.56% ex_string_compa libQt5Core.so.5.5.0 [.] QString::compare_helper
|
|--5.84%--
_ZN7QString14compare_helperEPK5QChariS2_iN2Qt15CaseSensitivityE@plt
| QString::compare_helper
| main
| |
| |--4.24%-- main
| | |
| | |--1.60%-- main
| | | |
| | | |--1.07%-- main
| | | | |
| | | | |--0.54%-- main
| | | | | main
| | | | |
| | | | --0.53%--
QString::compare_helper
| | | | main
| | | |
| | | --0.53%--
QString::compare_helper
| | | main
| | | main
| | |
QString::compare_helper
| | | main
| | | QString::compare_helper
...
The correct callgraph, as shown by --call-graph dwarf, is:
21.62% ex_string_compa libQt5Core.so.5.5.0 [.] QString::compare_helper
|
---QString::compare_helper
mainIs this a known (undocumented) limitation or a bug? Is there anything I could do to get this fixed?
Thanks
Signature · 3 lines
Milian Wolff [email protected] http://milianw.de
Re: Haswell LBR call stacks - broken
Quoted 10 lines · Milian Wolff
OK, with a more recent perf v4.2.rc5 on a Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz it actually works. Somewhat :) It is much faster, but the callstacks don't terminate properly, and are sometimes not correctly demangled. I observe the following behavior:
15.56% ex_string_compa libQt5Core.so.5.5.0 [.] QString::compare_helper | |--5.84%--_ZN7QString14compare_helperEPK5QChariS2_iN2Qt15CaseSensitivityE@plt
Maybe the demangler doesn't like the @plt.
Quoted 8 lines
| QString::compare_helper
| main
| |
| |--4.24%-- main
| | |
| | |--1.60%-- main
| | | |
| | | |--1.07%-- mainYes that looks like a bug.
Adding Kan.
-Andi
Quoted 30 lines
| | | | | | | | | |--0.54%-- main | | | | | main | | | | | | | | | --0.53%-- QString::compare_helper | | | | main | | | | | | | --0.53%-- QString::compare_helper | | | main | | | main | | | QString::compare_helper | | | main | | |
QString::compare_helper
...The correct callgraph, as shown by --call-graph dwarf, is:
21.62% ex_string_compa libQt5Core.so.5.5.0 [.] QString::compare_helper | ---QString::compare_helper mainIs this a known (undocumented) limitation or a bug? Is there anything I could do to get this fixed?
Thanks
Signature · 1 line
[email protected] -- Speaking for myself only
RE: Haswell LBR call stacks - broken
Hi Milian,
Is it possible to share your test case/steps with me?
Does --call-graph fp work?
Thanks,
Kan
Quoted 68 lines
Quoted 7 lines · Milian Wolff
OK, with a more recent perf v4.2.rc5 on a Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz it actually works. Somewhat :) It is much faster, but the callstacks don't terminate properly, and are sometimes not correctly demangled. I observe the following behavior:
15.56% ex_string_compa libQt5Core.so.5.5.0 [.]
QString::compare_helperQuoted 3 lines
| |--5.84%--_ZN7QString14compare_helperEPK5QChariS2_iN2Qt15CaseSensitivityE@pl t
Maybe the demangler doesn't like the @plt.
Quoted 8 lines
| QString::compare_helper | main | | | |--4.24%-- main | | | | | |--1.60%-- main | | | | | | | |--1.07%-- mainYes that looks like a bug.
Adding Kan.
-Andi
Quoted 16 lines
| | | | | | | | | |--0.54%-- main | | | | | main | | | | | | | | | --0.53%-- QString::compare_helper | | | | main | | | | | | | --0.53%-- QString::compare_helper | | | main | | | main | | | QString::compare_helper | | | main | | |Quoted 6 lines
QString::compare_helper
...The correct callgraph, as shown by --call-graph dwarf, is:
21.62% ex_string_compa libQt5Core.so.5.5.0 [.]
QString::compare_helperQuoted 8 lines
| ---QString::compare_helper mainIs this a known (undocumented) limitation or a bug? Is there anything I could do to get this fixed?
Thanks
--
[email protected] -- Speaking for myself only
Re: Haswell LBR call stacks - broken
Quoted 3 lines · Kan
Hi Milian,
Is it possible to share your test case/steps with me?
Sure, I hope Qt is fine with you.
main.cpp:
~~~~~~~~~~~~~~~~~~~~~~
#include <QString>
#include <QTextStream>
int main()
{
QStringList haystack;
for (int i = 0; i < 1000; ++i) {
haystack << QString::number(i);
}
uint matches = 0;
for (int i = 0; i < 1000; ++i) {
foreach (const QString &str, haystack) {
if (str == "needle") {
++matches;
}
}
}
QTextStream out(stdout);
out << "Matches: " << matches << endl;
return 0;
}~~~~~~~~~~~~~~~~~~~~~~
lbr.pro:
~~~~~~~~~~~~~~~~~~~~~~
TEMPLATE = app
SOURCES = main.cpp
CONFIG += releaseQMAKE_CXXFLAGS += -g
~~~~~~~~~~~~~~~~~~~~~~
To build, put both into a folder and then do:
~~~~~~~~~~~~~~~~~~~~~~
mkdir build
cd build
qmake-qt5 ..
make
perf record --call-graph lbr ./lbr
perf report --stdio
~~~~~~~~~~~~~~~~~~~~~~
Quoted 1 line
Does --call-graph fp work?
No, I'm on a 64bit architecture, and most libs (esp. Qt) is built without framepointers. --call-graph dwarf does work though.
Bye
Signature · 3 lines
Milian Wolff [email protected] http://milianw.de