调试模式非常慢?

时间:2013-11-18 12:20:05

标签: linux performance debugging gcc

在Linux上没有太多经验,我有一些经过良好测试的代码,没有任何补偿错误/来自MSVC,ICC的警告,也可以在Windows平台上完美运行。

然后我将这些代码复制到我新安装的Linux系统(Ubuntu 13.10 with GCC 4.8.1)然后我用CDT安装了最新版本的eclipse(3.8.1左右),并使用系统的GCC编译器进行配置。 / p>

Eclipse CDT / GCC可以很好地处理我编写的所有琐碎的测试代码,然后我要求GCC从Windows编译大量经过良好测试的代码。

GCC编译它没有任何错误并且没有警告,并且程序运行良好的琐碎工作负载,但是,一旦我给程序一些真实的有效负载,它基本上freezen,需要永远完成(当在Windows中,同一个程序可以在几秒钟内完成“真实世界”的有效载荷。

任何人都可以告诉我应该找到什么来解决这个问题,或者GCC在调试模式下是那么慢(我的意思是,比ICC / MSVC的调试模式慢至少2-3个数量级),谢谢。

对于发布模式,编译优化级别设置为O3,并且调试模式的默认设置(没有优化,或者至少是我认为的那样)。

问题是,我的感觉是ICC / MSVC的调试模式(没有优化)二进制比GCC快得多(我的意思是,快一千倍)。

更新:(目前看来我无法在stackoverflow发表评论,所以我必须在这里回复,对不起):

ams:好吧,我等了几分钟,看到程序仍然运行我只是中止它,所以我不知道程序是否可以完成。但是,只要有效载荷非常小,它就可以正常完成。

至于代码的瓶颈,嗯,我认为它的记忆有限。

大部分时间(80 +%)代码正在使用大输入数据阵列进行基数排序,我写的优化基数排序代码可以在Windows中每秒排序200-300万32位浮点值,但是使用相同的硬件,在linux中似乎需要几个小时才能对1000万长度数据阵列进行排序。

更新

感谢所有人的帮助,我发现问题出在一些宏,我搞砸了linux,现在一切正常。

4 个答案:

答案 0 :(得分:1)

您有三种选择:

  • 启用日志记录以查看代码的功能。如果您没有记录,请添加它。
  • 使用分析器收集有关时间花费的信息。看看valgrind。我有点担心你的应用程序永远不会终止;不确定valgrind是否可以处理这个问题。
  • 使用调试器并在一段时间后中断程序以查看其功能。重复,直到看到模式

答案 1 :(得分:1)

我同意那些说在gdb之类的调试器下运行它并用Ctrl-C中断它的人(在程序的输出窗口中)。然后在gdb中说thread 1以使其进入活动线程。然后说bt以获得堆栈跟踪。 然后通过在堆栈中键入updown(以及在必要时通过键入p variablename)数据来检查每行代码,这样您就可以理解为什么它正在执行它在你打断它的时间。

既然你知道它需要的时间比它应该的长,那就意味着你在行为不端的情况下抓住它的可能性非常接近于确定。

(注意:没有必要1.将此视为测量问题,或2.尝试区分无限循环或只是长时间运行。)

这是random-pausing技术。

答案 2 :(得分:0)

除了所有其他建议之外,我还想提一下GCC提供的new compiler flag -Og应该可以提高调试版本的性能。

答案 3 :(得分:0)

你使用" top"或者其他命令/工具来监视系统资源的运行时间(分配)....以便在处理期间更深入地了解内存消耗和CPU负载?

使用调试器,例如" gdb" (在Linux上可以正常工作)您可以添加(和删除)条件和无条件断点并逐步执行代码(在构建调试可执行文件之后)。 我用" gdb"集成在Eclipse中,它为您提供了许多关于运行时进程的视图(例如按钮和控制台窗口)。 您还可以添加其他测试代码打印语句,默认情况下会转发到您的控制台窗口....

使用调试器,可以确定在哪个子进程中消耗了大量时间/资源。在确定之后,您可以专注于解决特定问题/不规则/错误/资源食者。

您是否也在非调试模式下运行可执行文件("运行"而不是" debug")?如果是,您可以比较相对"表演"。