QT 关闭程序时"Segmentation fault"

    最近在s3c2440上移植了qt4.7.4,程序是可以跑了,但在关闭时总是出现"Segmentation fault",此后运行程序的终端就不再响应。怎么办呢???什么原因呢???这么大个工程编译一次就要半个小时,不好调试阿!!头晕
    n天之后的今天的昨天,我用strace追踪了下,命令如下:
    strace -f -F -o strace.log mainwindow -qws
    会在当前目录生成一个strace.log的追踪记录的文件。
    n天之后的今天,分析之,发现是在munmap( 0x400e5000, 37588)处奔溃了,搜索地址 0x400e5000
得到如下记录块:
----------------------------------------------------------------------------------------------------------------------->
501   open(" /lib/ts/linear.so", O_RDONLY) = 13
501   read(13, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\210\6\0\0004\0\0\0"..., 512) = 512
501   fstat64(13, {st_mode=S_IFREG|0755, st_size=16142, ...}) = 0
501   mmap2(NULL, 37588, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 13, 0) = 0x400e5000
501   mprotect(0x400e7000, 28672, PROT_NONE) = 0
501   mmap2(0x400ee000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 13, 0x1) = 0x400ee000
501   close(13)                         = 0
501   stat64("/etc/pointercal", {st_mode=S_IFREG|0644, st_size=51, ...}) = 0
-----------------------------------------------------------------------------------------------------------------------<
和触摸屏有关哦,假如把qt鼠标配置环境变量QWS_MOUSE_PROTO中的触摸屏去掉会怎么样???
于是把 QWS_MOUSE_PROTO的值由
export QWS_MOUSE_PROTO="tslib:/dev/input/event0 intelliMouse:/dev/input/mice"
改成
export QWS_MOUSE_PROTO="intelliMouse:/dev/input/mice"
结果是:触摸屏鼠标都能用,关闭程序,不会出现"Segmentation fault",哈哈 太兴奋了!!!几个月的心病终于去除!!!
再进一步,如果 环境变量QWS_MOUSE_PROTO为空会怎样?鼠标还能用麻?
于是改成如下
export QWS_MOUSE_PROTO=
嘿,鼠标、触摸屏一个不少都能用。而且也不奔溃,好家伙。搞定。
嘿嘿,strace还是蛮有用的阿,推荐下。

造成这个问题的关键是我把网上的环境配置直接拿过来用,但是嵌入式系统每个人的都不一样,所以不一定合适,最好的方式就是先构建一个最小系统,在这个基础上增加功能。这样就可以防止一个大系统陷入无从调试的尴尬境地。也更容易找出问题所在。


环境:
交叉编译器: arm-linux-gcc 4.6.2 (自制)
qt编译参数:
./configure \
-embedded arm \
-prefix ${PREFIX} \
-release \
-opensource \
-shared \
-fast \
-no-largefile \
-no-accessibility \
-no-sql-sqlite \
-no-sql-sqlite2 \
-no-qt3support \
-no-svg \
-no-webkit \
-no-javascript-jit \
-no-script \
-no-scripttools \
-no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-neon \
-qt-zlib \
-qt-gif \
-no-libtiff \
-qt-libpng \
-no-libmng \
-qt-libjpeg \
-no-openssl \
-optimized-qmake \
-xplatform qws/linux-arm-g++ \
-no-armfpa \
-little-endian \
-host-little-endian \
-qt-freetype \
-depths 32 \
-no-opengl \
-qt-gfx-linuxfb \
-qt-kbd-linuxinput \
-qt-mouse-linuxinput \
-qt-mouse-tslib -I${PREFIX}/include -L${PREFIX}/lib \
-no-glib \
-no-qvfb \
-no-separate-debug-info \
-no-nis \
-no-cups \
-no-iconv \
-no-dbus \
-no-phonon \
-no-phonon-backend \
-no-xmlpatterns \
-no-gfx-multiscreen \
-make libs -make examples -make demos -make qmake \
-no-xcursor -no-xfixes \
-no-mouse-qvfb
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(789) | 评论(0) | 转发(1) |
0

上一篇:gdb调试

下一篇:linux shm 进程之间内存共享

给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Segmentation fault (core dumped)是一种常见的错误,多数情况下是由于内存不当操作造成的。这种错误通常发生在空指针、野指针的读写操作,数组越界访问,或者破坏常量等情况下。为了避免这个问题,可以对每个指针进行声明后初始化为NULL。另外,调试是排除此问题的最好方法。可以使用工具如gdb来进行调试,通过backtrace和backtrace_symbols函数进行堆栈信息定位,再使用addr2line工具将指令的地址和可执行映像转换成文件名、函数名和源代码行数。[1][2] 此外,程序跳转出现Segmentation fault (core dumped)还可能是由以下原因引起的: 1. 内存访问越界:例如使用错误的下标导致数组访问越界,或者字符串没有正常使用结束符等。应该注意使用正确的字符串操作函数来防止读写越界。 2. 多线程程序使用了线程不安全的函数或多线程读写的数据未加锁保护。在多线程环境下,需要注意使用线程安全的函数,并对共享数据进行适当的加锁保护。 3. 非法指针:例如使用空指针或随意进行指针转换。在使用指针,应该确保指针指向的内存是有效的,并且按照正确的类型进行访问。 4. 堆栈溢出:不要使用过大的局部变量,以免造成堆栈溢出,破坏系统的栈和堆结构。 综上所述,程序跳转出现Segmentation fault (core dumped)可能是由于内存不当操作、内存访问越界、多线程问题、非法指针或堆栈溢出等原因引起的。需要仔细检查代码,确保内存操作的正确性,并进行适当的调试和修复。[1][2][3]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值