I'm experiencing a strange behavior that I need help resolving. We develop an Qt 5.8 application using Qt Creator for our i.MX6 board.
The application runs correctly in debug mode when it is started directly (or via gdb) on the target via a shell using the following argument:
-qmljsdebugger=port:10001,services:DebugMessages,QmlDebugger,V8Debugger,QmlInspector
However, whenever it is launched with remote gdb from host it prints out a relocation error. This behavior started to appear
recently when more signals/properties were added to a model (which in no different to the existing models).
The following is printed in Qt Creator:
Debugging starts
Listening on port 10000
Remote debugging from host 192.168.213.11
Process /opt/app/bin/app created; pid = 4923
/opt/app/bin/app: relocation error: /opt/app/bin/app: symbol _ZTVN10__cxxabiv120__si_class���e_infoE, version CXXABI_1.3 not defined in file libstdc++.so.6 with link time reference
If the following lines (+ one emit) are removed from the code it starts up correctly:
Q_PROPERTY(bool deleted READ getDeleted WRITE setDeleted NOTIFY deletedChanged)
Q_SIGNAL void deletedChanged();
I have also noticed that if additional signals are added I get different error messages, for example if 3 new unused signals are added (it seems that it does not matter to what model the signals are added) I get
/opt/app/bin/app: relocation error: /opt/app/bin/app: symbol ���St9exception, version GLIBCXX_3.4 not defined in file libstdc++.so.6 with link time reference
The project has about 25 models with about 100 properties in total.
Any ideas where to go from here?
EDIT: The libraries and applications on target are prelinked once at fresh startup. I noticed that it works correctly if the application to debug is prelinked before gdb-debugging starts. Not sure I understand why.
Related
Hello I have installed SFML in my M1 chip Bigsur using this tutorial https://www.youtube.com/watch?v=WOyp5n2FmZY and also fixed all the error related to M1 chip.But when I run my project I get this pop ups.
popups
dyld: Library not loaded: #rpath/../Frameworks/vorbisfile.framework/Versions/A/vorbisfile
Referenced from: /Library/Frameworks/sfml-audio.framework/Versions/2.5.1/sfml-audio
Reason: no suitable image found. Did find:
/Library/Frameworks/vorbisfile.framework/Versions/A/vorbisfile: code signature in (/Library/Frameworks/vorbisfile.framework/Versions/A/vorbisfile) not valid for use in process using Library Validation: library load disallowed by system policy
It even showed pop ups for every frameworks I went to settings and gave allow for each of them. But it kept on showing same popup how can I solve this problem in BigSur
I think you will find that the library in question has been quarantined by the operating system. I would suggest:
confirm the quarantine flag ls -l# /path/to/library-or-library_bundle
remove the quarantine flag sudo xattr -d com.apple.quarantine /path/to/library-or-library_bundle
You can also go to your system preferences, then Security & Privacy. On General you see the settings for Allow apps downloaded from:. If you have a message like the one you have mentioned above, it says here "your.framework" was blocked from use because it is not from an identified developer with a button Allow Anyway next to it. Click it.
I'm trying out STM32CubeIDE, and I've been trying to get it to work with the GDB QEMU debugging plugin that's part of the Eclipse CDT package. I've been able to create the project and debug configuration for my STM32F4-Discovery board, and the debugger partially launches, however, just as the simulator starts up, the GUI window it creates suddenly crashes and I get this error:
Error in final launch sequence
Failed to execute MI command:
-target-select remote localhost:1234
Error message from debugger back end:
Truncated register 18 in remote 'g' packet
Failed to execute MI command:
-target-select remote localhost:1234
Error message from debugger back end:
Truncated register 18 in remote 'g' packet
Truncated register 18 in remote 'g' packet
I think this is caused by some mismatch between the CDT plugin I installed and the GCC toolchain that shipped with my installation of Ubuntu 20.04. However, I'm not sure how to fix this.
Is there anything I try to fix this?
So it looks like there were a couple factors as to why this wasn't working. First off, the error messages that I was getting immediately after the GUI debugger terminated were due to an incorrect installation of the arm-none-eabi-gdb package. In order to fix this, I downloaded the package from the ARM site and followed the instructions detailed here. After installing the arm-none-eabi-gdb package again, I went into the project debug configuration settings, navigated to the "debugger" tab in this window, and then changed the GDB executable path from the variables the IDE had set for me to the actual GDB executable path (in this case /usr/bin/arm-none-eabi-gdb).
After that was done, the debugger would no longer immediately terminate, but I was still getting some errors in console shortly after it started (see below). In addition, the debugger GUI would produce no meaningful output, and Ubuntu would warn that the process had frozen.
NVIC: Bad read offset 0xd88
qemu-system-gnuarmeclipse: Attempt to set CP10/11 in SCB->CPACR, but FP is not supported yet.
To solve this, I right clicked the project in the project explorer panel of the IDE, then went to C/C++ build section, then to the Settings section under that, and then finally to the "Tool settings" section of this menu. Under "MCU settings", there are two options for "Floating point unit" and "Floating point ABI", which I changed to "None" and "Software implementation" respectively. After saving these configuration changes, I went to the system_stm32f4xx.c file under the src/ directory of the project, and commented out these lines:
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
After that, I cleaned the project, rebuilt it, and relaunched the debugger. It then functioned normally.
On Linux and Mac, when using dlopen() to load a shared library that links to another library, if linking fails because of a missing symbol, you can get the name of the missing symbol with dlerror(). It says something like
dlopen failed: cannot locate symbol "foo"
On Windows, when using LoadLibrary() to load a DLL with a missing symbol, you can only get an error code from GetLastError() which for this type of issue will always be 127. How can I figure out which symbol is missing, or a more verbose error message from LoadLibrary() that explains why the function failed?
I figured out a way using the MSYS2 terminal. Other methods might work with GUI software.
A major caveat is that this can't be done in pure C/C++ and released for end users. It's for developers only, but it's better than nothing.
Install Debugging Tools for Windows by downloading the Windows SDK and unchecking everything except Debugging Tools.
I could be wrong, but it seems that installing this software installs a hook into the Windows kernel to allow LoadLibrary() to write verbose information to stderr.
Open the MSYS2 Mingw64 terminal as an administrator and run
'/c/Program Files (x86)/Windows Kits/10/Debuggers/x64/gflags.exe' -i main.exe +sls
This prints the following to the terminal to confirm that the registry has been changed.
Current Registry Settings for main.exe executable are: 00000002
sls - Show Loader Snaps
Use -sls instead of +sls if you need to undo, since I believe that the change takes place for all programs called main.exe in Windows globally, not just for your file.
Then running main.exe should print debug information to stderr, but since I'm debugging an -mwindows application, it's not working for me.
But for some reason, running the binary with MSYS2's gdb allows this debug information to be printed to stderr.
Install mingw-w64-x86_64-gdb with MSYS2 and run gdb ./main.exe and type run or r.
Search for a section similar to the following.
warning: 1ec8:43a0 # 764081125 - LdrpNameToOrdinal - WARNING: Procedure "foo" could not be located in DLL at base 0x000000006FC40000.
warning: 1ec8:43a0 # 764081125 - LdrpReportError - ERROR: Locating export "foo" for DLL "C:\whatever\plugin.dll" failed with status: 0xc0000139.
warning: 1ec8:43a0 # 764081125 - LdrpGenericExceptionFilter - ERROR: Function LdrpSnapModule raised exception 0xc0000139
Exception record: .exr 00000000050BE5F0
Context record: .cxr 00000000050BE100
warning: 1ec8:43a0 # 764081125 - LdrpProcessWork - ERROR: Unable to load DLL: "C:\whatever\plugin.dll", Parent Module: "(null)", Status: 0xc0000139
warning: 1ec8:43a0 # 764081171 - LdrpLoadDllInternal - RETURN: Status: 0xc0000139
warning: 1ec8:43a0 # 764081171 - LdrLoadDll - RETURN: Status: 0xc0000139
Great! It says Procedure "foo" could not be located in DLL so we have our missing symbol, just like in POSIX/UNIX's dlopen().
While the answer from Remy Lebeau is technically correct, determining the missing symbol from GetLastError() is still possible on a Windows platform. To understand what exactly is missing, understanding the terminology is critical.
Symbol:
When a DLL is compiled, it's functions are referenced by symbols.
These symbols directly relate to the functions name (the symbols are
represented by visible and readable strings), its return type, and
it's parameters. The symbols can actually be read directly through a
text editor although difficult to find in large DLLs.DLL Symbols - C++ Forum
To have a missing symbol implies that a function within cannot be found. If this error occurs prior to using GetProcAddress(), then it's possible that any number of functions cannot be loaded due to missing prerequisites. This means it is possible that a library that you are attempting to load also requires a library that the first cannot load. These levels of dependency may go on for an unknown number of layers, but the only answer that GetLastError() can determine is that there was a missing symbol. One such method is by using Dependency Walker to determine the missing library the first library requires. Once all required libraries are available and can be found by that library (which can be its own can of worms), that library can be loaded via LoadLibrary().
I compiled GDB 7.8 for native debugging on my Arndale 5250 board running, linaro 3.12(2013). The GDB was configured as “arm-linux-gnueabihf” and built using statically linked libraries.
It works fine on the board but in “record and replay mode”. It generates the following message when came across a printf statement:
"Process record and replay target doesn't support ioctl request 0x7efff06c ()
( null)Process record: inferior program stopped.”
[process 2169] #1 stopped.
0x76f0f704 in ?? () from /lib/arm-linux-gnueabihf/libc.so.6
When proceeded further it cannot debug any more.
(gdb) n
Cannot find bounds of current function
I believe its because of some missing libraries on the target platform.
Please note that when I built GDB I copied only its exe to the target Arndale board, not any libraries. I thought statically linking with libraries will do the task.
Any idea how I can run process record and replay on ARM architecture like I usually do on my x86 machine?
gdb's process record feature works by executing each assembly instruction and recording its effects. When a calling into the kernel, it also has to know the effects of the system call. ioctl presents a singular challenge here because there are many possible iocctl calls.
From the description it sounds as though your libc is using an ioctl that gdb does not already know. In this case there is no solution other than to implement support for that call in gdb.
As soon as I run my code (note that I'm using C only, no QT and no C++) I get the following message from the application output inside the IDE:
Cannot obtain a handle to the inferior: The parameter is incorrect.
When I delete the makefiles and debug/release folders it's running but after some time I still get the error. It's not that much of a problem though, the code runs and everything is fine but this error pops up and it's quite annoying.
The content of the .pro file is:
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
QMAKE_CC = gcc -std=c99
SOURCES += main.c
Thanks in advance!
edit: I have added C++ tag, because this error occurs also for C++ console application as in my case.
I have met same problem. Tips and advices on forums are rather clueless, so I investigated problem myself and I have found that it's a bug in QtCreator.
There is dirty little program called qtcreator_process_stub. Whenever you run your program within IDE, IDE first runs qtcreator_process_stub and passes your program name as parameter (among some other parameters). qtcreator_process_stub then starts your program as separate process and prints its PID (and on windows also thread id). Information is printed to the pipe and then it is read by ConsoleProcess::readStubOutput(), which is part of Utils.dll library used by QtCreator.
The problem occurs when "inferior" process (your application) finishes execution before whole communication has been processed. ConsoleProcess::readStubOutput() attempts to use OpenProcess() on non-existing process with closed handle. OpenProcess() fails hence error "Cannot obtain a handle to the inferior: The parameter is incorrect.". Whole error is not handled very gently (Uhm, and now what?)... :-/
Solution:
When you add some user input action, pause, sleep, delay or just some loops, so that execution of your application is a bit longer error vanishes. There is enough time for ConsoleProcess::readStubOutput() to execute OpenProcess(), before your application quits. So as a workaroud I suggest to do that until the bug is fixed.
I got the same error repeatedly while working on a C++ project in Qt. I was able to solve it by copying one of the shared libraries(.dll) I was using in to the build folder.
So, if you are using any shared external libraries that are needed at runtime, make sure they are in the builds folder.