c++ - 调试 Qt 应用程序

标签 c++ qt debugging

我完成了一个应用程序从 Qt4 到 Qt5 的迁移,它编译了一切但它没有启动,当我运行它时没有窗口或崩溃或任何东西。当我调试它时,我一步一步地进行,但是在某一行之后我无法使用调试器做任何其他事情,黄色箭头消失并且步骤按钮变得不可点击,就像它崩溃但没有说明任何事情一样。

在 main.cpp 中有这一行

QCoreApplication::setApplicationName(AppData::instance().getAppName()); //conflicting line

冲突的部分是这个

AppData::instance().getAppName()

如果我走进去,它会把我带到这里

AppData& AppData::instance() {
    static AppData instance; // Conflicting line
    return instance;
}

我再次进入冲突行,它将我带到大约有 100 行的 AppData 构造函数,但冲突的是这一行:

AppData::AppData() {
    /*code*/
    connect(UsersModel::instance(), SIGNAL(usersOk()), 
        this, SIGNAL(loginsig())); //conflicting line
    /*more code*/

所以我又一次走进去,我发现了这个

UsersModel* UsersModel::instance() {

    static UsersModel* _instance = new UsersModel; //Conflicting line
    return _instance;
}

再次进入...

UsersModel::UsersModel(QObject *parent) : QAbstractListModel(parent) {
    connect(&(AppData::instance()), SIGNAL(authorized()), this, SLOT(getUsers())); //Conflicting line
    connect(&(AppData::instance()), SIGNAL(logoutsig()), this, SLOT(clear()));
}

现在有一件有趣的事情,在 Locals and Expressions 中它说 QObject parent value 是 0x0,我不知道这是否与这个问题有任何关系,但以防万一。我注意到当它执行 new UsersModel 时它不会放置 () 或任何东西,如果我尝试执行 new UsersModel(this) 它不会让我因为它是静态的,但是构造函数采用 QObject 父级,这就是它的 0x0 的原因.代码不是我的,所以要弄清楚发生了什么有点困难,但问题可能出在这部分。
应用程序输出中还有一条消息:

(Internal error: pc 0x0 in read in psymtab, but not in symtab.)

在“进入内部”按钮中单击几次后(由于某种原因它没有进入)它带我回到

AppData& AppData::instance() {
    static AppData instance; //Conflicting line
    return instance;
}

如果我尝试进入,调试器就会停止工作。
为了以防万一,我还尝试调试 getUsers() 函数,冲突行是:

void UsersModel::getUsers() {
    UsersReader* usersReader = new UsersReader(AppData::instance().getHost(), 
            AppData::instance().getPort(),
            AppData::instance().getSsl(),
            REST_EVENT_CLASS,
            REST_GET_USERS); //conflicting line

进入内部会将我带回 AppData::instance(),这应该会带我回到构造函数,但试图进入冲突行

static AppData instance;

只会让调试器再次“中断”
我记得调试一个错误,为此我在 SO 提出了另一个问题,它与静态的东西有关,所以可能有关系,虽然这是库的问题,但它们没有正确编译或其他什么。

如果有帮助,这里是链接:__do_global_ctors segfault somewhere in project, cant locate it

我在 Windows 7 x64 下工作,使用 Qt 5.2.1 并使用 MinGW 4.8 32 位编译,应用程序也是 32 位的。我希望有人知道出了什么问题。

Main.cpp 代码直到冲突行

QApplication a(argc, argv);
    { // uwaga! zachować ten blok (Warning! Keep this block)

    //QObject::tr("ddd");
    //Settings application data
    QTextCodec::codecForUtfText("UTF-8");
    QCoreApplication::setOrganizationName("Companyname");
    QCoreApplication::setOrganizationDomain("Company.domain");
    QCoreApplication::setApplicationName(AppData::instance().getAppName()); //conflicting line

最佳答案

似乎 AppData 和 UsersModel 实例具有循环初始化依赖性

AppData::AppData() {
    /*code*/
    connect(UsersModel::instance(), SIGNAL(usersOk()), 
        this, SIGNAL(loginsig())); //conflicting line
    /*more code*/
}

尝试将此代码从构造函数移至 init 方法:

void AppData::Init() {
    /*code*/
    connect(UsersModel::instance(), SIGNAL(usersOk()), 
        this, SIGNAL(loginsig())); //conflicting line
    /*more code*/
}

并调用 main() 或某个地方进行一次性初始化:

AppData::instance().Init();

关于c++ - 调试 Qt 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23800141/

相关文章:

c++ - 将前一个节点的地址存储到当前节点的 “prev”部分中

.net - 编译器错误 2039

c++ - QT.pro 文件 : How to change default include path for MAC frameworks

debugging - Safari Web Inspector网络限制

debugging - 如何调试 MPI 程序?

.net - 单步执行属性/函数 (F11) 无法按预期工作

c++ - 将 C++ 缓冲区公开为 Python 3 字节

c++ - Qt设置QPushButton的背景颜色

c++ - 使用 Core foundation 向 Mountain Lion 通知中心发送消息

c++ - 大多维 vector 初始化C++