主题 : qte运行为什么会出现segmentation fault? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 23048
精华: 0
发帖: 25
金钱: 125 两
威望: 25 点
综合积分: 50 分
注册时间: 2010-06-11
最后登录: 2011-03-16
楼主  发表于: 2010-09-09 08:39

 qte运行为什么会出现segmentation fault?

昨天在我的板子上接盘接口总算移植的差不多了,可是运行的时候出现segmentation fault这样的错误
按键键值都对上了,可是按键还没有反映,具体操作如下:
export QTDIR=/OPT/QT
export QTEDIR=$QTDIR
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

./amr -qws
键盘可以正常启动,但按下第一个按键之后就会出现segmentation fault的错误提示如下:
由于图片太大传不上来
create mouse auto
call openKeyboard
keyboards
create keyboard drive
device is usb
fd is 11
现在键盘已经正常启动了
我按下按键之后就出现下面的提示:
Key_8 is 56
segmentation fault

请哪位大哥帮小弟看一下,这到底是怎么回事啊,小弟先在此谢过了?
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
1楼  发表于: 2010-09-09 09:24
使用最新的交叉编译器即可解决。http://arm9download.cncncn.com/mini2440/linux/arm-linux-gcc-4.4.3-20100728.tar.gz
另外,我们也提供了QtE-4.6.3, 下载地址:http://www.arm9.net/download.asp
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2010-09-09 09:31

 回 楼主(自语的骆驼) 的帖子

"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 23048
精华: 0
发帖: 25
金钱: 125 两
威望: 25 点
综合积分: 50 分
注册时间: 2010-06-11
最后登录: 2011-03-16
3楼  发表于: 2010-09-09 10:49
怀疑是代码的问题,现在我把qkbdusb_qws.cpp我修改过的代码贴出来,请各位帮忙看一下,谢谢:
struct Myinputevent {

    unsigned int dummy1;
    unsigned int dummy2;
    unsigned short type;
    unsigned short code;
    unsigned int value;

};

void QWSUsbKbPrivate::readKeyboardData()
{
    Myinputevent event;
    int n = read(fd, &event, sizeof(Myinputevent) );
    qDebug("n is %x",n);
    if ( n != 16 )
            return;
        qDebug("event.dummy1 is %x",event.dummy1);
        qDebug("event.dummy2 is %x",event.dummy2);
        qDebug("event.type is %x",event.type);
        qDebug("event.code is %x",event.code);
        qDebug("event.value is %x",event.value);
    int key=event.code;
    int keycode=Qt::Key_unknown;
    switch(key & 0x00ff){
        case 0x60:
            keycode=Qt::Key_Enter;
            qDebug("key_enter is %d",keycode);
            break;
        case 0x45:
            keycode=Qt::Key_NumLock;
            qDebug("key_numlock is %d",keycode);
            break;
        case 0x37:
            keycode=Qt::Key_Down;
            qDebug("key_down is %d",keycode);    
            break;
        case 0x4e:
            keycode=Qt::Key_Plus;
            qDebug("key_plus is %d",keycode);    
            break;
        case 0x4a:
            keycode=Qt::Key_Tab;
            qDebug("key_tab is %d",keycode);    
            break;
        case 0x53:
            keycode=Qt::Key_Period;
            qDebug("key_period is %d",keycode);    
            break;
        case 0x62:
            keycode=Qt::Key_Up;
            qDebug("key_up is %d",keycode);    
            break;        
        case 0x52:
            keycode=Qt::Key_0;
            qDebug("key_0 is %d",keycode);    
            break;
        case 0x4f:
            keycode=Qt::Key_1;
            qDebug("key_1 is %d",keycode);    
            break;
        case 0x50:
            keycode=Qt::Key_2;
            qDebug("key_2 is %d",keycode);    
            break;                
        case 0x51:
            keycode=Qt::Key_3;
            qDebug("key_3 is %d",keycode);    
            break;    
        case 0x4b:
            keycode=Qt::Key_4;
            qDebug("key_4 is %d",keycode);    
            break;
        case 0x4c:
            keycode=Qt::Key_5;
            qDebug("key_5 is %d",keycode);    
            break;        
        case 0x4d:
            keycode=Qt::Key_6;
            qDebug("key_6 is %d",keycode);    
            break;    
        case 0x47:
            keycode=Qt::Key_7;
                qDebug("key_7 is %d",keycode);
            break;
        case 0x48:
            keycode=Qt::Key_8;
            qDebug("key_8 is %d",keycode);    
            break;    
        case 0x49:
            keycode=Qt::Key_9;
            qDebug("key_9 is %d",keycode);    
            break;    
        default:
            keycode=key;
            qDebug("key is %d",keycode);
            break;            
    }
    handler->processKeyEvent( 0, keycode, 0, true, false );
}

执行之后各值如下:
[root@hengda bin]# ls
amr
[root@hengda bin]# ./amr -qws
Creating mouse: Auto
call openKeyboard!
keyboards
no define QT_NO_STRINGLIST!
create keyboard drive
drive is usb
fd is 11           //在这里按下按键就出现下面的提示
n is 10
event.dummy1 is 1fb7
event.dummy2 is 7d8c0
event.type is 1
event.code is 45
event.value is 1
key_numlock is 4133
Segmentation fault
[root@hengda bin]#  

我有点不太明白,按键值是怎么读到event里面去的,
其中event.dummy1 is 1fb7
event.dummy2 is 7d8c0
event.type is 1
event.code is 45
event.value is 1
这个结构体里面的event.code是键值,那么其他结构变量各代表什么意思呢?
请那位大哥帮忙看一下是不是有问题?

我怀疑是调用了handler->processKeyEvent( 0, keycode, 0, true, false );的问题,
因为segmentation fault是调用了此函数之后出现的?
[ 此帖被自语的骆驼在2010-09-09 12:12重新编辑 ]
级别: 新手上路
UID: 23048
精华: 0
发帖: 25
金钱: 125 两
威望: 25 点
综合积分: 50 分
注册时间: 2010-06-11
最后登录: 2011-03-16
4楼  发表于: 2010-09-09 10:57
引用第1楼mindee于2010-09-09 09:24发表的  :
使用最新的交叉编译器即可解决。http://arm9download.cncncn.com/mini2440/linux/arm-linux-gcc-4.4.3-20100728.tar.gz
另外,我们也提供了QtE-4.6.3, 下载地址:http://www.arm9.net/download.asp

我的ARM板内核是linux-2.4.18和qte3.3.8都是用arm-linux-gcc-2.95.3编译的
以前用2.95.3编译之后都能正常工作的,用更高的编译器编译之后可以用吗?
我用3.3.2的编译了一下通不过啊
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
5楼  发表于: 2010-09-09 12:30
这个结构体里面的event.code是键值,那么其他结构变量各代表什么意思呢?

这个结构是驱动定义的,看你内核里键盘驱动的源代码。

我怀疑是调用了handler->processKeyEvent( 0, keycode, 0, true, false );的问题,
因为segmentation fault是调用了此函数之后出现的?

最简单的方法: 在这句话前后加上qDebug()。不过我建议你还是用GDB调试,这是做程序开发的最基本技能。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 23048
精华: 0
发帖: 25
金钱: 125 两
威望: 25 点
综合积分: 50 分
注册时间: 2010-06-11
最后登录: 2011-03-16
6楼  发表于: 2010-09-09 12:45
好的,准备用gdb调试一把
顺便问一下对gdb的版本有要求吗?
我的编译器是arm-linux-gcc-2.95.3的
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
7楼  发表于: 2010-09-09 17:03

 回 6楼(自语的骆驼) 的帖子

如果你用的2.95.3的工具链里带有arm-linux-gdb和gdbserver的话,最好用里面带的。否则你需要用2.95.3的工具链交叉编译出gdbserver。另外你可能还需要自己制作arm-linux-gdb。
至于GDB的版本,我想能和2.95.3这么老的gcc搭配的应该是5.0的gdb了。参考这里http://www.lslnet.com/linux/f/docs1/i58/big5387051.htm
[ 此帖被kasim在2010-09-09 17:13重新编辑 ]
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 23048
精华: 0
发帖: 25
金钱: 125 两
威望: 25 点
综合积分: 50 分
注册时间: 2010-06-11
最后登录: 2011-03-16
8楼  发表于: 2010-09-09 18:10
好的,谢谢