Python debugger segfaults with tvm

Root issue

Occasionally found that libtvm.so might be linked to libedit.so once it is linked against libllvm.so, which might be the root cause of the issue.

I have no idea why libLLVM.so is linked against libedit. @zhiics @were @haichen any ideas?

Build without LLVM

# ipdb does not crash
$ python -c "import tvm; import ipdb; ipdb.set_trace()"
--Return--
None
> <string>(1)<module>()

ipdb>

# not linked against libedit.so
$ ldd libtvm.so
        linux-vdso.so.1 (0x00007ffd1f7ae000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fdeeb4bf000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fdeeb136000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fdeead98000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fdeeab80000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdeea961000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdeea570000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fdeec6b6000)

Build with LLVM

# ipdb crashes immediately
$ python -c "import tvm; import ipdb; ipdb.set_trace()"
[1]    21458 segmentation fault (core dumped)  python -c "import tvm; import ipdb; ipdb.set_trace()"

# linked against libedit.so
$ ldd libtvm.so
        linux-vdso.so.1 (0x00007ffd9b5f1000)
        libLLVM-8.so.1 => /usr/lib/llvm-8/lib/libLLVM-8.so.1 (0x00007fe136a4d000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe136849000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fe1364c0000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe136122000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe135f0a000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe135ceb000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe1358fa000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fe13b731000)
        libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007fe1356f2000)
        libedit.so.2 => /usr/lib/x86_64-linux-gnu/libedit.so.2 (0x00007fe1354bb000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fe13529e000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fe135096000)
        libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fe134e6c000)

Let’s take a look at libLLVM-8.so

$ ldd /usr/lib/llvm-8/lib/libLLVM-8.so
        linux-vdso.so.1 (0x00007ffe15464000)
        libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f75d039f000)
        libedit.so.2 => /usr/lib/x86_64-linux-gnu/libedit.so.2 (0x00007f75d0168000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f75cff4b000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f75cfd43000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f75cfb3f000)
        libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f75cf915000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f75cf6f6000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f75cf358000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f75cefcf000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f75cedb7000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f75ce9c6000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f75d41f4000)

Yet another work around

After PR 3954 is merged, we are able to run cmake with extra arguments. Then, in config.cmake, you may force linking to static LLVM library, e.g.

set(USE_LLVM "/usr/bin/llvm-config-8 --ignore-libllvm")

In that case, we can invoke pdb normally without having to worry about core dumps…

$ python -c "import tvm; import ipdb; ipdb.set_trace()"
--Return--
None
> <string>(1)<module>()

ipdb>

Exiting Debugger.
3 Likes