查看完整版本: [-- Qt 在ARM板上运行时segmentation fault的问题 --]

QTCN开发网 -> Qt嵌入式开发 -> Qt 在ARM板上运行时segmentation fault的问题 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

nautiluslee 2016-07-11 10:44

Qt 在ARM板上运行时segmentation fault的问题

做了一个ARM板上运行的Qt程序,点击Debug按钮时编译没问题,开机画面也能显示出来,就是运行到一个创建label行的时候会出现segmentation fault的信息,然后ARM板上屏幕就黑了。我是在类声明中声明了一组label数组,然后在构造函数中创建label的实例,部分代码如下:
    QLabel *label[50];
    QPushButton *button[50];

    label = new QLabel(this);
我在这句前后加了打印信息,前面的能打印后面就没有,所以应该是这句出了问题。
有人遇到过相同的情况吗?

大漠之鹰 2016-07-11 11:49
for(int i=0; i < 50; i++)
{
    label=new QLabel(this);
}

nautiluslee 2016-07-11 12:09
大漠之鹰:for(int i=0; i < 50; i++)
{
    label=new QLabel(this);
}
 (2016-07-11 11:49) 

我本来就是用for循环创建label的,有个控制label数量的变量是存在配置文件中。

兵317 2016-07-11 12:20
析构函数中delete这些创建的label了吗?保险起见还是加上吧,虽说Qt中有某些机制让写delete的少。开发板上运行Qt发生段错误的原因,最常见的应该就是指针问题了。

大漠之鹰 2016-07-11 13:01
for(int i=0; i < 50; i++)
{
    label=new QLabel(this);
}
label后边跟索引 了吗?上边的代码怎么没有了,是论坛的问题吗?段错误是访问空指针造成的

大漠之鹰 2016-07-11 13:02
真是论坛的问题吗?label后边的方括号i没了

uidab 2016-07-11 13:27
大漠之鹰:for(int i=0; i < 50; i++)
{
    label=new QLabel(this);
}
label后边跟索引  了吗?上边的代码怎么没有了,是论坛的问题吗?段错误是访问空指针造成的 (2016-07-11 13:01) 

一般情况arm返回的段错误都和指针有关。

nautiluslee 2016-07-11 13:28
兵317:析构函数中delete这些创建的label了吗?保险起见还是加上吧,虽说Qt中有某些机制让写delete的少。开发板上运行Qt发生段错误的原因,最常见的应该就是指针问题了。 (2016-07-11 12:20) 

那我创建的是数组,请问该怎么delete呢?

nautiluslee 2016-07-11 13:34
大漠之鹰:真是论坛的问题吗?label后边的方括号i没了
 (2016-07-11 13:02) 

没关系,我知道你要表达那个意思

大漠之鹰 2016-07-11 14:05
uidab:一般情况arm返回的段错误都和指针有关。 (2016-07-11 13:27) 

什么啊,看清楚我说的啥啊。我说的论坛有问题,回复的内容会丢东西

大漠之鹰 2016-07-11 14:07
只有arm上有问题吗?其它平台会有问题吗?代码可以发上来看看?Qt的版本是多少?

nautiluslee 2016-07-11 14:16
大漠之鹰:只有arm上有问题吗?其它平台会有问题吗?代码可以发上来看看? (2016-07-11 14:07) 

我是在类声明中定义的label和pushbutton数组,然后在构造函数通过读取ini配置文件,来显示label和pushbutton。

声明:
private:
    Ui::events *ui;

    int i, total_num, label_num, pushButton_num;
    QLabel *label[50];
    QPushButton *button[50];
    QSettings *events_setting;
    QString str, strg, strs, strt;
    QStringList list;

构造函数:
    events_setting = new QSettings("/test/config/Events.ini", QSettings::IniFormat);
    QFile file("/test/config/Events.ini");
    file.open(QFile::ReadOnly);
    QTextStream in(&file);
    str = in.readLine();
    list = str.split(",");

    total_num = events_setting->value("/total_num/num").toInt();
    label_num = events_setting->value("/label_num/num").toInt();
    pushButton_num = events_setting->value("/pushButton_num/num").toInt();

    for(i=0;i<label_num;i++)
    {
        strg = list + "geometry";
        strs = list + "stylesheet";
        strt = list + "text";
        qDebug()<<"1";
        label = new QLabel(this);
        qDebug()<<"2";
        label->setGeometry(events_setting->value(strg).toRect());
        label->setStyleSheet(events_setting->value(strs).toString());
        label->setText(events_setting->value(strt).toString());
        label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    }

nautiluslee 2016-07-11 14:24
大漠之鹰:只有arm上有问题吗?其它平台会有问题吗?代码可以发上来看看?Qt的版本是多少?
 (2016-07-11 14:07) 

Linux上同样的代码使正常的

nautiluslee 2016-07-11 14:26
大漠之鹰:只有arm上有问题吗?其它平台会有问题吗?代码可以发上来看看?Qt的版本是多少?
 (2016-07-11 14:07) 

对了,我想起来,另外一个子界面我调用close函数后,再点进去checkbox被勾选的状态没有改变。这是不是说明了子界面的控件都没有被删除?

uidab 2016-07-11 14:50
大漠之鹰:
什么啊,看清楚我说的啥啊。我说的论坛有问题,回复的内容会丢东西

确实会丢,这个可能和发代码没用代码  "  <> "  括起来有关系。

nautiluslee 2016-07-11 14:55
uidab:确实会丢,这个可能和发代码没用代码  "  <> "  括起来有关系。 (2016-07-11 14:50) 

版主,能帮我看下问题吗

uidab 2016-07-11 14:57
nautiluslee:[表情]版主,能帮我看下问题吗 (2016-07-11 14:55) 

我现在也在arm下开发,调试起来确实不方便,从现象上看基本确定是和指针有关的。

nautiluslee 2016-07-11 15:01
uidab:我现在也在arm下开发,调试起来确实不方便,从现象上看基本确定是和指针有关的。 (2016-07-11 14:57) 

鉴于之前关闭子界面的时候里面的控件状态并没有改变,我想应该是没有delete的原因,但是试了几种delete方法都不行

uidab 2016-07-11 15:04
nautiluslee:[表情]版主,能帮我看下问题吗 (2016-07-11 14:55)

从代码上看你是要定义指针数组,new之前没有判断NULL,new之后没有判断是否成功。一般来讲PC上new之后都会成功,我不知道你的arm上空间大小多大。从你的说明上看是new出错了。
另外,没看到你是怎么删除的。

uidab 2016-07-11 15:08
nautiluslee:鉴于之前关闭子界面的时候里面的控件状态并没有改变,我想应该是没有delete的原因,但是试了几种delete方法都不行 (2016-07-11 15:01) 

arm上你可以用这个QStackedWidget

nautiluslee 2016-07-11 15:11
uidab:从代码上看你是要定义指针数组,new之前没有判断NULL,new之后没有判断是否成功。一般来讲PC上new之后都会成功,我不知道你的arm上空间大小多大。从你的说明上看是new出错了。
另外,没看到你是怎么删除的。
 (2016-07-11 15:04) 

你说的arm上的空间是指什么空间?

一种是在析构函数里删除的:
linemenu::~linemenu()
{
    delete ui;

    
    for(i=0;i<50;i++)
    {
        delete label;
    }
    for(i=0;i<50;i++)
    {
        delete button;
    }
    for(i=0;i<50;i++)
    {
        delete box;
    }
    
}

另外一种方法是在new之后,接了一行设置属性:
label->setAttribute(Qt::WA_DeleteOnClose);

uidab 2016-07-11 15:25
nautiluslee:你说的arm上的空间是指什么空间?
一种是在析构函数里删除的:
linemenu::~linemenu()
....... (2016-07-11 15:11) 

空间是指内存加硬盘。毕竟是嵌入式,要考虑性能。

我去年也按你这种方式试过,执行top命令查看 new  widget之前和之中,以及delete widget之后,发现delete之后很久使用的内存数值都不下降,就放弃这种方式了。毕竟完成任务要紧,需要优化可以慢慢来。

nautiluslee 2016-07-11 16:14
uidab:空间是指内存加硬盘。毕竟是嵌入式,要考虑性能。
我去年也按你这种方式试过,执行top命令查看 new  widget之前和之中,以及delete widget之后,发现delete之后很久使用的内存数值都不下降,就放弃这种方式了。毕竟完成任务要紧,需要优化可以慢慢来。 (2016-07-11 15:25) 

请问这跟创建的子界面类型有关系吗?我的主界面是mainwindow,子界面都是dialog。是不是关闭dialog的时候里面的控件就是不会销毁的?

uidab 2016-07-11 17:22
nautiluslee:请问这跟创建的子界面类型有关系吗?我的主界面是mainwindow,子界面都是dialog。是不是关闭dialog的时候里面的控件就是不会销毁的? (2016-07-11 16:14) 

肯定会销毁的。你不是在Linux上没问题嘛!!

nautiluslee 2016-07-11 17:41
uidab:肯定会销毁的。你不是在Linux上没问题嘛!!
 (2016-07-11 17:22) 

也对哦

大漠之鹰 2016-07-13 21:08
可以远程gdb跟一下


查看完整版本: [-- Qt 在ARM板上运行时segmentation fault的问题 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled