mini2440开发板运行Qt程序出现Segmentation fault的另一种奇葩原因:Ubuntu下使用FileZilla通过FTP方式传输程序

使用QWT-6.1.2写了一个名为dataplot的小程序,Ubuntu下运行正常,遂交叉编译后传到开发板上,运行,报错:Segmentation fault。

主机环境:Ubuntu 12.04 + gcc 4.6.3 + Qt 4.8.1

开发环境:arm-linux-gcc 4.4.3 with EABI + QtE 4.6.3 (均为mini2440官方提供) 

解决过程

网上查阅一堆资料,各种重新编译Qt库、换交叉编译器等等,实在有些繁琐,也不能保证符合我的情况,因为前几天交叉编译的几个小程序是可以运行的,应该不是qt库和qwt库的问题。

为了简化问题,直接修改dataplot代码,只留下一个显示提示信息的label标签,不能再简单了。然后交叉编译,传到开发板上,仍然Segmentation fault,奇怪!开发板更复杂的Qt程序都运行过,为什么今天不行了呢?

应该不是程序问题,为了进一步缩小范围,将前几天编译并可以在2440上成功运行的qwt_test程序重新交叉编译一下,传到开发板,依然Segmentation fault,简直不科学。

虽然很奇葩,但是却也验证了不是代码问题,也不是库或编译器的问题。

想到这次与前些天调试程序的唯一区别就是使用的FTP传输软件不同。博主一直使用FTP方式将程序传输到开发板上,之前一直是在windows下通过FlashFXP将Qt程序传入开发板的,今天为了省事,直接在Ubuntu下使用FileZilla将程序传入开发板。

试一试,打开VMware的共享,在Ubuntu中将dataplot程序直接复制到/mnt/hgfs/ubuntu share目录(这个目录实际上是Win7宿主机E:/Ubuntu Share目录,分区格式为NTFS)下,然后在Windows下打开FlashFXP,将Ubuntu Share目录下的dataplot程序传入开发板,传入的时候FlashFXP会提示出现同名但不同大小的新文件(难道问题就在这里?)覆盖,确认覆盖即可。在开发板上执行dataplot程序,成功运行!

问题虽然解决,但原因博主尚不知道,如果有哪位高人了解还请告知。

作为参考,博主Ubuntu下的FileZilla版本是直接apt-get的3.5.3版本,Windows下的FlashFXP是5.0.0版本


================================================================================

下面总结一些网络上解决Qt程序Segmentation fault的方法,以备不时之需

尝试更换交叉编译器

很多朋友在移植Qt-embedded 4.xx的时候都使用了友善之臂公司提供的交叉编译器,
虽然Qt与Qt应用程序都编译成功,但运行Qt应用程序时却经常会出现段错误(Segmentation Fault),
可以尝试使用openmoko(一个开源手机项目)提供的编译器,同样是EABI,版本为4.1.2
http://www.qtopia.net/modules/mydownloads/singlefile.php?lid=38
经测试,运行Qt应用程序时不会出现段错误(Segmentation Fault)。

更改Qt程序运行参数

”应该是QWS_SIZE设置的问题,我有一个程序QWS_SIZE=320x240的时候可以运行,然后设置为QWS_SIZE=320x480就报段错误了“

“中文字体问题,运行程序使用./myQtApp -qws -fn SIMHEI”


修改Qt库并重新编译

程序 qt-embedded-linux-opensource-src-4.5.0/src/gui/embedded/qscreenlinuxfb_qws.cpp
作如下修改:

410行:
/*            //EmbedSky_del start 20091208
    canaccel = useOffscreen();
    if(canaccel)
        setupOffScreen();
*/            //EmbedSky_del end 20091208
    canaccel = false;

706行:
/*                //EmbedSky_del start 20091208
    if (canaccel) {
        *entryp=0;
        *lowest = mapsize;
        insert_entry(*entryp, *lowest, *lowest);  // dummy entry to mark start
    }
*/                //EmbedSky_del end 20091208
    canaccel = false

可能解决segmentation fault问题,请大家测试

修改了qscreenlinuxfb_qws.h,用友善之臂提供的arm-linux-gcc-4.3.2.tgz重新编译QT4.5.0-arm(release方式),试了2个程序可以正常运行。

NOTE: This is a HACK, and not a pretty one either. It makes sure that it hardcoded doesn't use off-chip graphic memory. I don't use off-chip graphic memory, but if you do, this hack is useless.

其他

  • “有的时候是因为 源码中有多余的 空格 ,切忌!”
  • “我的是烧写FLASH有误导致的”
  • “”有时候是我们编写的程序的问题,例如我写了一个:char buff[7]="Hello";就会出现Segmentation Fault 段错误,但改成:strcpy(buff,"Hello");后就没有了!奇怪不?”
  • “我以前遇见过,原因是QT的应用程序界面大小超出”
  • "程序损坏了,或者是开发程序用的Qt库和部署用的Qt库不一致。"(程序损坏,这个原因和博主的应该最接近了

参考资料

Qt-embedded 4.xx 运行出现 Segmentation Fault 段错误的解决办法

运行 qt/embedded 4.4.2 出现 segmentation fault

Qt: Segmentation fault问题怎么解决

你可能感兴趣的:(ftp,qt,FileZilla,mini2440,fault,segmentation)