Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在嵌入式系统上运行Qt Helloworld时出现分段错误_Linux_Qt_Filesystems_Embedded_Arm - Fatal编程技术网

Linux 在嵌入式系统上运行Qt Helloworld时出现分段错误

Linux 在嵌入式系统上运行Qt Helloworld时出现分段错误,linux,qt,filesystems,embedded,arm,Linux,Qt,Filesystems,Embedded,Arm,我为ARM交叉编译了一个Helloworld可执行文件。它在我朋友的开发板上运行得很好,但在我的开发板上出现了一个分割错误,所以失败了。这两块板在硬件和软件上略有不同 我的问题是,如何在我的板上调试?调试这样一个简单的程序相对容易吗?它是否表明可执行文件没有问题,问题很可能在于我的主板的文件系统 代码如下: #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) {

我为ARM交叉编译了一个Helloworld可执行文件。它在我朋友的开发板上运行得很好,但在我的开发板上出现了一个分割错误,所以失败了。这两块板在硬件和软件上略有不同

我的问题是,如何在我的板上调试?调试这样一个简单的程序相对容易吗?它是否表明可执行文件没有问题,问题很可能在于我的主板的文件系统

代码如下:

#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();
}

最有可能的是,gdb被移植为在ARM目标上运行,但若并没有,或者为了便于调试,您应该使用gdb远程调试。

Gdbserver是应该在目标上运行的应用程序。下面是如何使用它的演示。抄袭自维基百科

目标设置:

remote$ gdbserver :2345 hello_world
Process hello_world created; pid = 2509
Listening on port 2345
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) 
主机设置:

remote$ gdbserver :2345 hello_world
Process hello_world created; pid = 2509
Listening on port 2345
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) 

一般来说,您不应该在堆栈上创建从QObject派生的对象,因为QMetaObject系统管理具有父子关系的对象的生命周期,因此可能会释放堆栈上的内存。

因此,您在LD_LIBRARY_PATH之后提到,您的问题已得到解决。在设置LD_LIBRARY_路径之前,如果您的应用程序出现错误找不到libQt,则表示您没有Qt,但您的应用程序出现此Seg错误,这意味着您有库,但不是正确的库,因此我们可以说您在文件系统上多次安装了Qt

您现在指向的一个已针对当前硬件正确编译,但另一个未针对导致SEGFULT的硬件编译,并且此安装位于库搜索路径中

此seg故障的一个可能原因可从下面确定

以下是一些cflag,如果没有为任何特定硬件正确设置,编译的应用程序/库会在运行时导致Seg故障

-行军 -姆图内 -mfpu

因此,如果您的二进制/库是用say-march=armv5a编译的,并且您在ARM9上运行它,那么它将像这样崩溃

还请注意,并非所有应用程序都使用这些标志,通常这些标志是优化标志,由基本系统库使用,如Qt、Glib、bison、Gtk等

即使您编写了一个简单的基于C的hello world应用程序,并且您的glibc没有针对您的硬件进行编译,您也会遇到Seg故障

作者的回答:

造成这种分段故障的原因正是电路板的软件差异。具体而言,环境变量LD_LIBRARY_PATH是在故障板中预定义的。我通过命令添加了路径

export LD_LIBRARY_PATH=$LD_LIBRARAY_PATH:/my/qt/path
因此,预定义的路径仍然不知道以何种方式导致了问题

如果我将命令更改为

export LD_LIBRARY_PATH=/my/qt/path

可执行文件可以工作。

此代码中没有父/子关系,它是从Qt文档复制的。你的答案与问题无关。硬件/软件的差异听起来似乎是原因。您可能需要使用QMAKESPEC中的不同参数为硬件重新编译Qt。您好@beaver,您能否尝试更改编译器的优化标志remove-O2并重试请不要在问题中给出答案。给答案贴上自己的答案,并将其标记为解决方案。