Segmentation fault while running Qt Helloworld on embedded system

柔情痞子 提交于 2019-12-11 04:24:49

问题


I cross-compiled a Helloworld executable for ARM. It worked well on my friend's development board, but failed with a " segmentation fault " on my board. The two boards are slightly different in both hardware and software.

My question is, how can I debug in my board? Is it relatively easy to debug such a simple program? Does it indicate that there's nothing wrong with the executable and the problem most probably lies in the filesystem of my board?

Below is the code:

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QPushButton hello("Hello world");
hello.resize(100, 30);

hello.show();
return app.exec();
}

And the executable is generated by the following commands:

qmake -project
qmake
make

回答1:


most probably gdb is ported to be run on ARM target but in case lack of that or for easy debugging, you should use gdb remote debugging. http://sourceware.org/gdb/onlinedocs/gdb/Remote-Debugging.html#Remote-Debugging

Gdbserver is the application should be run on target. the following is demonstration howto use it. (copied from wikipedia)

Target settings:

remote$ gdbserver :2345 hello_world
Process hello_world created; pid = 2509
Listening on port 2345

Host settings:

local$ gdb -q hello_world
Reading symbols from /home/user/hello_world...done.
(gdb) target remote 192.168.0.11:2345
Remote debugging using 192.168.0.11:2345
0x002f3850 in ?? () from /lib/ld-linux.so.2
(gdb) continue
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x08048414 in main () at hello_world.c:10
10              printf("x[%d] = %g\n", i, x[i]);
(gdb) 



回答2:


So you mentioned after LD_LIBRARY_PATH your issue was resolved. And before setting the LD_LIBRARY_PATH if your application gives error can not find libQt then it means you do not have Qt, but your application is giving this Seg Fault that mean you have library but not the right one so we can say you have multiple installations of Qt on your filesystem.

The one to which you have pointed now is correctly compiled for your current hardware but the other one is not compiled for your hardware causing the Segfault and this installation is in your library search path.

One possible reason of this seg fault can be determined from below.

Following are some CFLAGS which if not set correctly for any particular hardware, the compiled application / library causes Seg faults at run time.

-march -mtune -mfpu

So if your binary / library is compiled with say -march=armv5a and you are running it on ARM9 then it will crash like this.

Also note that not all application uses these flags, usually these flags are optimization flags and are used by base system libraries (i.e Qt, Glib, bison, Gtk etc....).

Even if you write a simple C based hello world application and your glibc is not compiled for your hardware you will get the Seg fault.




回答3:


Answer from Author:

What caused this "segmentation fault" is exactly the software difference of the board. Specifically, the environmenat variable LD_LIBRARY_PATH was predefined in the failed board. And I added my path by the command

export LD_LIBRARY_PATH=$LD_LIBRARAY_PATH:/my/qt/path

Thus the predefined paths caused the problem ( still don't know in what way ).

If I change the command to

export LD_LIBRARY_PATH=/my/qt/path

the executable works.




回答4:


As a general rule you shouldn't create objects derived from QObject on the stack as the QMetaObject system manages the life-time of objects with a parent-child relationship, and will therefore risk free()ing memory on the stack.



来源:https://stackoverflow.com/questions/12296217/segmentation-fault-while-running-qt-helloworld-on-embedded-system

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!