Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Run environment in Qt Creator



  • I've stripped-down my code for the purpose of understanding why invoking it in Qt Creator gives a different behaviour than terminal execution. The program does essentially nothing. The mainwindow is created, but show() is not called. After app.exec() it just sits there until I hit ctrl-C. This is the expected behaviour, and this is what happens in a terminal when it's run from the command line. But when I click the green arrow in Qt Creator, with the same Working Directory as the terminal invocation, the program crashes.
    This happens whether I select System Environment or Build Environment. I'd like know why it crashes. How can I find this out?



  • @gibbogle
    If it "crashes". start it off with debugging from Qt Creator (I don't use it, for "green arrow" there will be one which is just "Run" and another which is "Debug Run" or similar) and you will get a stack trace of where it crashes. If not, something else is happening.



  • @jonb My question mainly concerns the run environments. What makes the one used in Qt Creator different from the system environment used in a terminal?
    Running in debugging mode gives a popup "The inferior stopped because it received a signal from the operating system: SIGSEGV. I also get 24 lines of assembler code, which convey nothing to me.



  • @gibbogle
    SISSEGV, IIRC, means a null, or possibly out-of-bounds, pointer dereference, somewhere. Not sure exactly what you mean by "I also get 24 lines of assembler code", I would have hoped that if you look at the stacktrace (e.g. gdb command bt) you would get a few non-assembler frames at the top, but maybe not.

    If you put a breakpoint on the very first line of your main(), do you even get there? If you do it's somewhere in the code, and you can at least step around and see what it does in. But if you do not even hit that then it implies during internal run-time start-up, and you have a deeper problem..

    (Assuming you build for debug/non-debug similarly when you run inside or outside Creator.) The only difference between the Creator System/Build environments and the terminal environment, apart from working directory, should be environment variables. You can view what Creator is passing from the environment variables it shows, and compare that against the terminal environment via env | sort, or similar. You could also try running your program from the terminal through gdb your-executable to test the debug situation outside of Creator.

    If you're still stuck. Under Linux you can run an executable via strace executable [args]. This produces tracing output showing every system call being made. In the "crash" case, the last few lines may give you a clue where your program is getting to just before it dies. Now, as I said I don't use Creator, but hopefully where the "command line" is for running your program you can change that to strace your-executable to try?

    One other thought: if you say outside Creator "it just sits there until I hit ctrl-C." that means the process (still) has a controlling terminal. When you run it from Creator I think it does not --- doesn't Creator have an option checkbox when launching/debugging programs to say "create a (new) terminal when running this"? It might be worth switching that on to see whether that makes any differnce.

    These are my thoughts :)


  • Lifetime Qt Champion

    Hi,

    To add to @JonB, Qt Creator modifies the PATH, (DY)LD_LIBRARY_PATH or DYLD_FRAMEWORK_PATH environnement variables, depending on the OS, in order for your application to find the Qt version of the Kit you are using to build it.



  • @jonb Thanks for all your helpful suggestions, I am starting to explore them.



  • @jonb There doesn't seem to be a way to change the command line in Qt Creator, you can only supply arguments.
    With a breakpoint at the first line in main(), the execution doesn't reach there. The Disassembler screen shows 24 lines of assembler, but the green arrow (presumably indicating the failure point) is on the 6th line (the last here):
    0x7fffee371fda 00 00 add %al,(%rax)
    0x7fffee371fdc 00 00 add %al,(%rax)
    0x7fffee371fde 66 90 xchg %ax,%ax
    0x7fffee371fe0 48 8b 05 21 0f b2 00 mov 0xb20f21(%rip),%rax # 0x7fffeee92f08
    0x7fffee371fe7 48 89 05 ba 6b b3 00 mov %rax,0xb36bba(%rip) # 0x7fffeeea8ba8
    0x7fffee371fee f0 ff 00 lock incl (%rax)

    I have tried ticking the "Run in terminal" box, but that had no effect.
    A couple of the linked libraries are Release, not Debug, but I don't know if that could cause this crash - anyway, it doesn't when I run the program outside Qt Creator.



  • @sgaist I gathered that something of the sort was being done. I'm not sure how to see exactly what PATH and LD_LIBRARY_PATH are being used, but I also can't see why some inconsistency there would cause this segment violation error.


  • Lifetime Qt Champion

    @gibbogle

    A couple of the linked libraries are Release, not Debug, but I don't know if that could cause this crash

    On Linux: no, on Windows: indeed.

    But for all platforms, you cannot mix Qt libraries of different versions.

    So if, for example, your LD_LIBRARY_PATH contains one Qt version, and you want to run against another version in Creator (which adds the other Qt version to LD_LIBRARY_PATH too), you might encounter strange things.

    Newer Creator versions let you open a terminal with run environment set up, you can use that for further investigation.

    Regards



  • @aha_1980 I'm running a pretty recent version of Creator, 4.9.1, but I can't see how to open a terminal with run environment set up. I do see the checkbox for 'Run in terminal', and there is a field 'Run configuration', which currently holds the name of the executable. Is that related to what you have mentioned? Can you give me some pointers?

    I don't have another Qt version in LD_LIBRARY_PATH.

    Thanks


  • Lifetime Qt Champion

    @gibbogle

    In Creator 4.10 it's here:

    0_1568619918779_f46311d7-c0e4-47c3-a326-e0f6356d647a-image.png

    It may look a bit different in 4.9, but the Projects context menu on a file contains that entry.

    Regards



  • @aha_1980
    When I open a terminal with any one of the three environment options (Build, System, Run) and execute the program at the command line, it doesn't crash. It seems that for the purposes of running my program the three environments are all equivalent. When it is invoked by one of the green arrows in Creator, it crashes.


  • Lifetime Qt Champion

    @gibbogle said in Run environment in Qt Creator:

    @aha_1980
    When I open a terminal with any one of the three environment options (Build, System, Run) and execute the program at the command line, it doesn't crash. It seems that for the purposes of running my program the three environments are all equivalent. When it is invoked by one of the green arrows in Creator, it crashes.

    Ok, so we still have no solution for your problem, but we know that the environment is unguilty.

    Does that also happen if you create a "Hello World" example with the wizards?

    And coming back to @JonB's strace: you can create a custom run configuration (Project > Build & Run > Run > Run configuration > Add > Custom) and see which output you get, hopefully that gives some insight?

    Regards



  • @aha_1980
    I am able to build and run the examples, and also an application to test Qt3d functionality that I made from a couple of the examples.

    I set up a custom run configuration (thanks for explaining that), but when I run it, a couple of 'Permission denied' errors are generated, one apparently from execve, the other from fstat (unfortunately it does not seem to be possible to copy-and-paste from the terminal), so strace "exited with 1".


  • Lifetime Qt Champion

    @gibbogle ok, so if the examples work, it must be your project.

    Have you already wiped the build folder and .pro.user and rebuild your project?

    Are you linking external libs?

    Regards


  • Qt Champions 2019

    @gibbogle said in Run environment in Qt Creator:

    it does not seem to be possible to copy-and-paste from the terminal

    It is possible: mark text in terminal and press Ctrl-Shift-c to copy (to paste into terminal use Ctrl-Shift-v). Or use context menu of your terminal.



  • @aha_1980
    Yes, I just again wiped the build folder and .pro.user and rebuilt. No change.
    Yes, I am linking external libs.

    The program runs (Debug and Release) in a terminal.



  • @jsulm
    When I do Ctrl-Shift-c all that happens is a ^C is displayed.
    I'm not sure what the context menu of the terminal is. If I right-click at the top I just get Minimize, Maximize, Move etc.


  • Qt Champions 2019

    @gibbogle said in Run environment in Qt Creator:

    If I right-click at the top I just get Minimize

    not at the top, but inside the terminal.



  • @jsulm
    Sorry, I'm still not with you, right-click inside the terminal just highlights text. Is it possible that I have a different terminal program from your one? In the list of Applications on Ubuntu 18.04 I see XTerm and UXTerm. They both behave the same way. Do they need to be configured to have the behaviour you describe?


  • Qt Champions 2019

    @gibbogle XTerm and UXTerm are not the standard terminals on default Ubuntu installation. You should try the one Ubuntu provides by default (I think it's the one from Gnome).



  • @jsulm
    I'll have a look around, but these are the only ones that Ubuntu 18.04 shows in the list of installed apps (by clicking on the 3x3-dot-grid icon.) There are odd things about this version, e.g. I installed gedit, but it doesn't show up in the list.

    Edit: I had to install gnome-terminal, and I see that it provides some useful features.



  • Having another look at this:
    Although I installed gnome-terminal, which supports copy-and-paste, when I run the Custom Executable in Qt Creator is still uses XTerm, which doesn't support copying.
    When I run with Custom Executable a great number of messages are generated, and they don't mean much to me. I do see, however, reference to libraries in /usr/local/Qt-4.8.6/lib, and in /usr/lib/x86_64-linux-gnu. Neither of these directories is in my LD_LIBRARY_PATH, and I don't know why they are being searched. I do have Qt-4.8.6 installed. I am suspecting that somehow when invoked inside Creator, the program is doing something with 4.8.6 libraries, and this is causing the crash.
    A reminder: the program runs correctly at a terminal.


  • Qt Champions 2019

    @gibbogle Can you show the errors/warnings you get?



  • @jsulm
    It looks like a few hundred lines, and unfortunately I can't copy and paste them, unless I can find a way to make Creator use the gnome terminal program. ...
    OK, I just found out how to do that. This is horrendously long (more than 800 lines).

    Oh, there is a strict limit on the number of characters. I'll copy the first lines and the last lines.
    First 35 lines:
    execve("/home/gib/vspheroid-fem/build-vspheroid-Qt3d-Release/vspheroid-Qt3d-first-try", ["/home/gib/vspheroid-fem/build-vs"...], 0x7ffdf2a51980 /* 55 vars */) = 0
    brk(NULL) = 0x5618cdaba000
    access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
    access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/gib/bin/tls/x86_64/x86_64/libqwt.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/gib/bin/tls/x86_64/x86_64", 0x7ffd269838a0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/gib/bin/tls/x86_64/libqwt.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/gib/bin/tls/x86_64", 0x7ffd269838a0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/gib/bin/tls/x86_64/libqwt.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/gib/bin/tls/x86_64", 0x7ffd269838a0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/gib/bin/tls/libqwt.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/gib/bin/tls", 0x7ffd269838a0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/gib/bin/x86_64/x86_64/libqwt.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/gib/bin/x86_64/x86_64", 0x7ffd269838a0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/gib/bin/x86_64/libqwt.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/gib/bin/x86_64", 0x7ffd269838a0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/gib/bin/x86_64/libqwt.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    stat("/home/gib/bin/x86_64", 0x7ffd269838a0) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/home/gib/bin/libqwt.so.6", O_RDONLY|O_CLOEXEC) = 3
    read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\32\7\0\0\0\0\0"..., 832) = 832
    fstat(3, {st_mode=S_IFREG|0775, st_size=1626000, ...}) = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd843ba8000
    mmap(NULL, 3432576, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fd84363c000
    mprotect(0x7fd843775000, 2097152, PROT_NONE) = 0
    mmap(0x7fd843975000, 53248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x139000) = 0x7fd843975000
    mmap(0x7fd843982000, 128, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fd843982000
    close(3) = 0
    openat(AT_FDCWD, "/home/gib/vspheroid-fem/build/Release/libvspheroid-fem.so", O_RDONLY|O_CLOEXEC) = 3
    read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p$\1\0\0\0\0\0"..., 832) = 832
    fstat(3, {st_mode=S_IFREG|0755, st_size=521272, ...}) = 0
    mmap(NULL, 5435000, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fd84310d000
    mprotect(0x7fd84318a000, 2093056, PROT_NONE) = 0
    mmap(0x7fd843389000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7c000) = 0x7fd843389000
    mmap(0x7fd84338c000, 2817656, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fd84338c000
    close(3) = 0

    Last 21 lines
    rt_sigaction(SIGRTMIN, {sa_handler=0x7fd839300cb0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7fd83930d890}, NULL, 8) = 0
    rt_sigaction(SIGRT_1, {sa_handler=0x7fd839300d50, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7fd83930d890}, NULL, 8) = 0
    rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
    prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
    futex(0x7fd8392fa0c8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
    brk(NULL) = 0x5618cdaba000
    brk(0x5618cdadb000) = 0x5618cdadb000
    rt_sigaction(SIGRT_32, {sa_handler=0x7fd832637820, sa_mask=~[RTMIN RT_1], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7fd83b0c3f20}, NULL, 8) = 0
    futex(0x7fd833f45f38, FUTEX_WAKE_PRIVATE, 2147483647) = 0
    futex(0x7fd833f45f38, FUTEX_WAKE_PRIVATE, 2147483647) = 0
    brk(0x5618cdafc000) = 0x5618cdafc000
    openat(AT_FDCWD, "/dev/urandom", O_RDONLY|O_CLOEXEC) = 3
    read(3, "19\374\220", 4) = 4
    fstat(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
    fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
    fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
    fstat(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
    fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
    fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
    --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_ACCERR, si_addr=0x7fd83c15e5c0} ---
    +++ killed by SIGSEGV (core dumped) +++



  • There is something funny about the directories being searched. For example, in the above you can see:
    /home/gib/bin/x86_64/libqwt.so.6
    In fact that library is in /home/gib/bin, and there is no x86_64 subdirectory, in fact there are no subdirectories to /home/gib/bin.
    In Projects > Build & Run > Run > Run Environment > Details I open a terminal by clicking Open Terminal, then inspect the LD_LIBRARY_PATH:

    gib@gigabyte:~$ echo $LD_LIBRARY_PATH
    /home/gib/Qt5.13.0/5.13.0/gcc_64/lib:/home/gib/qwt-6.1.3/lib:/home/gib/bin:/home/gib/OpenCMISS/opencmiss/install/lib:/home/gib/bin

    You'll see that /home/gib/bin appears twice. That's because I found that I had to add the variable LD_LIBRARY_PATH with value /home/gib/bin to the Run environment, because otherwise the execution fails with the message that libqwt.so.6 cannot be found. This makes no sense to me, because /home/gib/bin is already in the path. I suspect that this odd behaviour is related to the crashing. It is as if LD_LIBRARY_PATH is somehow being corrupted.

    Edit: I forgot to mention that libqwt.so.6 is in /home/gib/bin.


Log in to reply