[llvm-bugs] [Bug 44068] New: LLDB Not Stepping into Multiple Inheritance Virtual Functions

via llvm-bugs llvm-bugs at lists.llvm.org
Tue Nov 19 13:28:34 PST 2019


https://bugs.llvm.org/show_bug.cgi?id=44068

            Bug ID: 44068
           Summary: LLDB Not Stepping into Multiple Inheritance Virtual
                    Functions
           Product: lldb
           Version: 9.0
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: All Bugs
          Assignee: lldb-dev at lists.llvm.org
          Reporter: acwilson96 at gmail.com
                CC: jdevlieghere at apple.com, llvm-bugs at lists.llvm.org

Created attachment 22842
  --> https://bugs.llvm.org/attachment.cgi?id=22842&action=edit
Reproducer program.

Overview:

Using LLDB to debug polymorphic objects that have multiple inheritance will not
step into virtual functions.

Steps to Reproduce:
```
$ clang++ -std=c++11 -g -O0 reproducer.cpp -o clang.out
$ lldb clang.out
(lldb) target create "clang.out"
Current executable set to 'clang.out' (x86_64).
(lldb) b 36                                                                    
                                                                               
                  Breakpoint 1: where = clang.out`main + 103 at
reproducer.cpp:36:16, address = 0x0000000000400d67
(lldb) r
Process 2764 launched: '/home/rdtscp/Documents/lldb_reproducer/clang.out'
(x86_64)
Process 2764 stopped
* thread #1, name = 'clang.out', stop reason = breakpoint 1.1
    frame #0: 0x0000000000400d67 clang.out`main(argc=1,
argv=0x00007fffffffe808) at reproducer.cpp:36:16
   33   int main(int argc, char **argv) {
   34     using namespace Test;
   35     std::shared_ptr<Interface> object = std::shared_ptr<Concrete>(new
Concrete());
-> 36     int output = object->vFun();
   37     std::cout << output << std::endl;
   38     return output;
   39   }
(lldb) s
Process 2764 stopped
* thread #1, name = 'clang.out', stop reason = step in
    frame #0: 0x0000000000400d86 clang.out`main(argc=1,
argv=0x00007fffffffe808) at reproducer.cpp:37:16
   34     using namespace Test;
   35     std::shared_ptr<Interface> object = std::shared_ptr<Concrete>(new
Concrete());
   36     int output = object->vFun();
-> 37     std::cout << output << std::endl;
   38     return output;
   39   }
(lldb)
```

Altering the `Concrete` class to be:
```
class Concrete : // public Base,
                 public Interface {
public:
  virtual int vFun() override {
    volatile int x = rand();
    if (x > 0)
      return x;
    else
      return 0;
  }
};
```

Will result in:
```
$ clang++ -std=c++11 -g -O0 reproducer.cpp -o clang.out
$ lldb clang.out
(lldb) target create "clang.out"
Current executable set to 'clang.out' (x86_64).
(lldb) b 36
Breakpoint 1: where = clang.out`main + 104 at reproducer.cpp:36:16, address =
0x0000000000400cf8
(lldb) r
Process 2869 launched: '/home/rdtscp/Documents/lldb_reproducer/clang.out'
(x86_64)
Process 2869 stopped
* thread #1, name = 'clang.out', stop reason = breakpoint 1.1
    frame #0: 0x0000000000400cf8 clang.out`main(argc=1,
argv=0x00007fffffffe808) at reproducer.cpp:36:16
   33   int main(int argc, char **argv) {
   34     using namespace Test;
   35     std::shared_ptr<Interface> object = std::shared_ptr<Concrete>(new
Concrete());
-> 36     int output = object->vFun();
   37     std::cout << output << std::endl;
   38     return output;
   39   }
(lldb) s
Process 2869 stopped
* thread #1, name = 'clang.out', stop reason = step in
    frame #0: 0x0000000000400fec
clang.out`Test::Concrete::vFun(this=0x0000000000615c20) at reproducer.cpp:23:24
   20                      public Interface {
   21     public:
   22       virtual int vFun() override {
-> 23         volatile int x = rand();
   24         if (x > 0)
   25           return x;
   26         else
(lldb)
```

The above shows that making the `Concrete` class inherit from the `Base` class
prevents us from stepping into `vFun()`.


System Settings:
```
OS: Debian GNU/Linux 9.11 (stretch) x86_64
Model: VirtualBox 1.2
Kernel: 4.9.0-11-amd64
Uptime: 1 hour, 3 minutes
Packages: 1722
Shell: zsh 5.3.1
CPU: Intel i5-7360U (1) @ 2.3GHz
GPU: VMware SVGA II Adapter
Memory: 219MB / 996MB
```

```
$ clang++ --version
clang version 9.0.0-svn364966-1~exp1+0~20190702204433.1332~1.gbpb44072 (trunk)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
$ lldb --version
lldb version 9.0.0
```

Additional Information:
I tried using:
```
g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
GNU gdb (Debian 7.12-6) 7.12.0.20161007-git
```

To see if my code was incorrect, but g++ and gdb were able to step into
"vFun()" fun.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20191119/937d0c61/attachment.html>


More information about the llvm-bugs mailing list