1

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

可执行文件由以下命令生成:

qmake -project
qmake
make
4

4 回答 4

3

很可能 gdb 被移植到在 ARM 目标上运行,但如果缺少它或为了便于调试,您应该使用 gdb 远程调试。 http://sourceware.org/gdb/onlinedocs/gdb/Remote-Debugging.html#Remote-Debugging

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) 
于 2012-09-06T09:31:33.527 回答
0

因此,您在 LD_LIBRARY_PATH 之后提到您的问题已解决。在设置 LD_LIBRARY_PATH 之前,如果您的应用程序给出错误找不到 libQt,那么这意味着您没有 Qt,但是您的应用程序给出了这个 Seg Fault,这意味着您有库但不是正确的库,所以我们可以说您有多个安装Qt 在您的文件系统上。

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

可以从下面确定此段故障的一个可能原因。

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

-march -mtune -mfpu

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

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

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

于 2012-09-07T13:28:15.780 回答
0

作者回复:

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

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

因此,预定义的路径导致了问题(仍然不知道以什么方式)。

如果我将命令更改为

export LD_LIBRARY_PATH=/my/qt/path

可执行文件有效。

于 2013-08-22T13:58:14.983 回答
-3

作为一般规则,您不应该创建从QObject堆栈上派生的对象,因为 QMetaObject 系统管理具有父子关系的对象的生命周期,因此会冒着free()堆栈内存的风险。

于 2012-09-06T13:52:35.337 回答