2012-09-06 28 views
1

我交叉編譯了一個Helloworld可執行文件,用於ARM。它在我的朋友的開發板上運行良好,但在板上的「分段錯誤」失敗。這兩個主板在硬件和軟件方面略有不同。在嵌入式系統上運行Qt 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 
+0

硬件/軟件的差異聽起來像他們是原因。有可能你可能需要在你的QMAKESPEC中用不同的參數重新編譯硬件的Qt。 – jlunavtgrad

+0

嗨@beaver,你可以嘗試更改編譯器的優化標誌(刪除-O2)並重試 –

+0

請不要在問題中提供答案。給答案自己的答案帖子,並將其標記爲解決方案。 –

回答

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) 
-3

由於作爲QMetaObject系統管理就不應該創建QObject堆棧上派生的對象一般規則具有親子關係的對象的生命週期,因此會在堆棧上存儲內存。

+2

此代碼中沒有父/子關係,它從Qt文檔複製而來。你的回答與這個問題無關。 –

0

所以你LD_LIBRARY_PATH後提到你的問題就解決了。並且在設置LD_LIBRARY_PATH之前,如果你的應用程序給出的錯誤找不到libQt,那麼這意味着你沒有Qt,但是你的應用程序給了這個Seg Fault,這意味着你有庫但不是正確的,所以我們可以說你有多個安裝Qt在你的文件系統上。

的一個你所指出的,現在它被正確編譯當前的硬件,但另一個不編譯您的硬件造成的段錯誤,這是安裝在你的庫搜索路徑。

此seg故障的一個可能的原因可以從下面確定。

以下是一些CFLAGS如果不能正確設置任何特定的硬件,編譯應用程序/庫使賽格故障在運行時。

-march -mtune -mfpu

所以,如果你的二進制文件/庫編譯說-march = armv5a和你在ARM9運行它,然後它會崩潰這樣。

另外請注意,並非所有的應用程序使用這些標誌,通常這些標誌是優化標誌,並通過基本系統庫使用(即Qt的,油腔滑調,野牛,GTK等...)。

即使你編寫了一個簡單的基於C的hello world應用程序,並且你的glibc沒有爲你的硬件編譯,你也會得到Seg錯誤。從作者

0

答:

是什麼原因造成這種「分段錯誤」正是董事會的軟件差異。具體來說,環境變量LD_LIBRARY_PATH是在故障板中預定義的。並且我增加了我的道路通過命令

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

因此預定義的路徑造成的問題(還不知道以什麼方式)。

如果我改變命令

export LD_LIBRARY_PATH=/my/qt/path 

可執行的作品。

相關問題