lldb doesn't work on centos7

Hi,

I build llvm+clang+lldb 3.7.0 from source code on centos7, the build command is “cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} -DLLVM_LIBDIR_SUFFIX=64”, there is no error during building process.

And then I compile following c++ code using command “clang++ -std=c++11 -stdlib=libc++ -lc++abi -g t.cpp”:

// t.cpp
#include
using namespace std;
int main() {
string s = “aa”;
cout << s;
}

Try lldb to debug a.out, found that I can’t print string s which shows empty:

lldb a.out
(lldb) target create “a.out”
Current executable set to ‘a.out’ (x86_64).
(lldb) l
4 int main() {
5 string s = “aa”;
6 cout << s;
7 }
(lldb) b 6
Breakpoint 1: where = a.out`main + 94 at t.cpp:6, address = 0x0000000000400e5e
(lldb) r
Process 150 launched: ‘/root/a.out’ (x86_64)
Process 150 stopped

  • thread #1: tid = 150, 0x0000000000400e5e a.outmain + 94 at t.cpp:6, name = 'a.out', stop reason = breakpoint 1.1 frame #0: 0x0000000000400e5e a.outmain + 94 at t.cpp:6
    3 using namespace std;
    4 int main() {
    5 string s = “aa”;
    → 6 cout << s;
    7 }
    (lldb) p s
    (std::__1::string) $0 = {}

Could you please help point out what’s wrong in my env? Thanks.

Thanks,
Zhenglin

Hi,

I build llvm+clang+lldb 3.7.0 from source code on centos7, the build command is “cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} -DLLVM_LIBDIR_SUFFIX=64”, there is no error during building process.

And then I compile following c++ code using command “clang++ -std=c++11 -stdlib=libc++ -lc++abi -g t.cpp”:

// t.cpp
#include
using namespace std;
int main() {
string s = “aa”;
cout << s;
}

Try lldb to debug a.out, found that I can’t print string s which shows empty:

lldb a.out
(lldb) target create “a.out”
Current executable set to ‘a.out’ (x86_64).
(lldb) l
4 int main() {
5 string s = “aa”;
6 cout << s;
7 }
(lldb) b 6
Breakpoint 1: where = a.out`main + 94 at t.cpp:6, address = 0x0000000000400e5e
(lldb) r
Process 150 launched: ‘/root/a.out’ (x86_64)
Process 150 stopped

  • thread #1: tid = 150, 0x0000000000400e5e a.outmain + 94 at t.cpp:6, name = 'a.out', stop reason = breakpoint 1.1 frame #0: 0x0000000000400e5e a.outmain + 94 at t.cpp:6
    3 using namespace std;
    4 int main() {
    5 string s = “aa”;
    → 6 cout << s;
    7 }
    (lldb) p s
    (std::__1::string) $0 = {}

Could you please help point out what’s wrong in my env? Thanks.

Thanks,
Zhenglin

HI,

a couple of random shots in the dark:

- could you paste the output of "frame variable --raw-output s"? (This
disables lldb's type formatters. The goal is to see if the problem is
in the formatter, or in lldb not finding the variable in the first
place).

- could you compile your test executable with -fno-limit-debug-info
and see if that helps?

pl

Hi Pavel,

Thanks for your reply. Seems lldb not finding the variable in the first place.

  • thread #1: tid = 154, 0x0000000000400e5e a.outmain + 94 at t.cpp:5, name = 'a.out', stop reason = breakpoint 1.1 frame #0: 0x0000000000400e5e a.outmain + 94 at t.cpp:5
    2 using namespace std;
    3 int main() {
    4 string s = “aa”;
    → 5 cout << s;
    6 }
    (lldb) frame variable --raw-output s
    (std::__1::string) s = {}

I added -fno-limit-debug-info in my test, and it works now. But why?

Thanks,

Zhenglin

Also I found that the size of my program binary increases from 140M to 180M after -fno-limit-debug-info is added. Seems a lot of debug info is added?

Yes the debug info does get bigger. But this is better than having the compiler omit the "std::string" definition so that you can't view stuff from the STL.

Greg

Make sense. Thanks.