Skip to contentSkip to conversation

Haswell LBR call stacks

DISCUSSION Milian Wolff 3 participants 5 messages Jun 14, 2015 – Aug 5, 2015

lore
Share & tools
lore
#0 lore raw

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
#1 lore raw

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
               main

Is 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
#2 lore raw

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%-- main

Yes 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
               main

Is 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
#3 lore raw

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_helper

Quoted 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%-- main

Yes 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_helper

Quoted 8 lines
            |
            ---QString::compare_helper
               main

Is 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

#4 lore raw

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 += release
QMAKE_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