日期是12/02/10.圣诞节前几天正在逐渐消失,作为一名Windows程序员,我几乎成了一个重要的障碍.我一直在使用AQTime,我已经尝试过困,有光泽,而且非常困,正如我们所说,VTune正在安装.我曾尝试使用VS2008探测器,它一直在积极惩罚,而且经常无法察觉.我使用了随机暂停技术.我检查了呼叫树.我已经解雇了函数跟踪.但令人痛苦的事实是,我正在使用的应用程序超过一百万行代码,可能还有另外一百万行的第三方应用程序.
我需要更好的工具. 我已经阅读了其他主题. 我已经尝试了每个主题中列出的每个分析器.只需要比这些垃圾和昂贵的选择更好的东西,或几乎没有收获的荒谬工作.为了使问题更加复杂,我们的代码经过严格的线程化,并运行了许多Qt事件循环,其中一些非常脆弱,以至于由于时序延迟而导致重负荷仪表崩溃.不要问我为什么我们运行多个事件循环.没有人能告诉我.
在Windows环境中,Valgrind还有更多选择吗?
有没有什么比我已经尝试过的大量破碎工具更好的了?
是否有任何旨在与Qt集成的东西,也许是在队列中有用的事件显示?
我尝试过的工具的完整列表,以及斜体中非常有用的工具:
我没试过的建议工具:
备注:目前 英特尔环境.VS2008,提升库.Qt 4+.他们所有人的悲惨态度:通过trolltech进行Qt/MFC整合.
概要
在许多其他问题中,最近已将许多组件切换到不正确的线程模型,由于我们下面的代码突然不再是多线程的,因此导致严重的挂起.我不能说更多,因为它违反了我的保密协议,但我可以告诉你,通过临时检查甚至正常的代码审查都不会发现这种情况.如果没有分析器,调用图和随机暂停,我们仍然会在美丽的蓝色天空中尖叫着我们的愤怒.值得庆幸的是,我与一些我见过的最好的黑客合作,我可以获得一个充满伟大工具和优秀人才的惊人"诗歌.
Gentlefolk,我非常欣赏这一点,并且唯一的遗憾是我没有足够的代表来奖励你们每个人.我仍然认为这是一个重要的问题,要比我们到目前为止得到的更好的答案.
结果,在接下来的三个星期的每周,我将提供我能负担得起的最大奖金,并用我认为不是常识的最好的工具授予它答案.三个星期后,如果你原谅我的惩罚,我们希望已经积累了一些关于剖析器的确切概况.
外卖
使用分析器.他们对Ritchie,Kernighan,Bentley和Knuth来说已经足够了.我不在乎你认为你是谁.使用分析器.如果你得到的那个不起作用,找另一个.如果你找不到一个,代码一.如果你不能编码一个,或者它是一个小挂机,或者你只是卡住,使用随机暂停.如果一切都失败了,请聘请一些研究生来敲打一个剖析器.
现在,我不得不说我不认为在W7x64环境中分析C++代码有一个明确的选择,但肯定有一些选项无法执行任何有用的服务.
在调试期间,我想看看等待我的程序的事件循环.它可能已经泛滥,我希望看到什么信号,没有(手动)向每个Q_EMIT添加特定的日志消息.
可能的解决方案可能是看一些包含事件队列的内部qt数据结构(有这样的事情吗?怎么样?)
要么 -
为每个发出的信号写一条日志信息(这可能吗?).
还有其他想法吗?
(Windows上的QT 4.8,使用visual studio 2012)
QObject当它们的工作线程在它们之前完成时,s 很容易变成无线程的。发生这种情况时,Qt 不会释放它们的计时器 ID,即使计时器不再处于活动状态。因此,出现QBasicTimer::stop: Failed. Possibly trying to stop from a different thread警告。它主要是外观上的后果,但确实表明计时器 id 泄漏,因此有一个解决方法会很好。下面的例子触发了这个问题:
#include <QtCore>
int main(int argc, char *argv[]) {
static_assert(QT_VERSION < QT_VERSION_CHECK(5,11,0), "");
QCoreApplication app(argc, argv);
QObject object;
object.startTimer(1000);
QThread workThread;
workThread.start();
object.moveToThread(&workThread);
QTimer::singleShot(500, &QCoreApplication::quit);
app.exec();
workThread.quit();
workThread.wait();
}
Run Code Online (Sandbox Code Playgroud)
如果解决方法不必对定时器的分配方式进行任何修改,那就太好了,即除了 Qt 已经做的之外,不需要额外的定时器跟踪。