> On Feb 6, 2017, at 5:58 PM, Roman Popov <ripo...@gmail.com> wrote:
> 
> Hello, 
> I just found out that sometimes I don't get correct dynamic type in LLDB even 
> if I compile with g++.  How can I get typeinfo/vtable dump from LLDB to check 
> if it is still the same name matching issue? 


Stop where dynamic typing fails, and take the pointer that is failing to be 
properly typed and do:

(lldb) memory read --format address my_ptr

Then look at the first entry that is in the output and it should be "vtable for 
" and take all the characters that follow this and are before the " + XXX" and 
check to see if LLDB knows about this type. 

If we use your previous source:

#include <iostream>
#include <typeinfo>

using namespace std;

struct base_type {  virtual ~base_type(){} };

template <class T1, class T2, unsigned SIZE>
struct derived0 : base_type {};

template <class T1, class T2>
struct derived1 : base_type {};

int main(int argc, char ** argv) {

    base_type * bptr0 = new derived0<int, int, 1024>();
    base_type * bptr1 = new derived1<int, int >();

    cout << typeid(*bptr0).name() << endl;
    cout << typeid(*bptr1).name() << endl;

    return 0;
}




If we compile this into "a.out":

% lldb a.out
(lldb) b /return 0/
(lldb) r
(lldb) memory read --format address bptr0
0x1001002f0: 0x0000000100002120 vtable for derived0<int, int, 1024u> + 16
....

We now take all text past the "vtable for " and before the " + 16" and lookup 
the type by name:

(lldb) image lookup -t "derived0<int, int, 1024u>"

Note this doesn't work, but if we remove the 'u' from 1024 it does work:

(lldb) image lookup -t "derived0<int, int, 1024>"
Best match found in /tmp/a.out:
id = {0x000065da}, name = "derived0<int, int, 1024>", byte-size = 8, decl = 
main.cpp:9, compiler_type = "class derived0 : public base_type {
}"



_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to