Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在调试模式下非常慢?_Linux_Performance_Debugging_Gcc - Fatal编程技术网

Linux 在调试模式下非常慢?

Linux 在调试模式下非常慢?,linux,performance,debugging,gcc,Linux,Performance,Debugging,Gcc,在Linux方面没有太多经验,我有一些经过良好测试的代码,没有从MSVC、ICC收到任何遵从性错误/警告,也在windows平台上完美运行 然后我将这些代码复制到我新安装的linux系统(Ubuntu13.10和GCC4.8.1),然后我用CDT安装了最新版本的eclipse(3.8.1左右),并用系统的GCC编译器对其进行了配置 EclipseCDT/GCC可以很好地处理我编写的所有琐碎的测试代码,然后我要求GCC从Windows编译大量经过良好测试的代码 GCC编译它时没有错误,也没有警告,

在Linux方面没有太多经验,我有一些经过良好测试的代码,没有从MSVC、ICC收到任何遵从性错误/警告,也在windows平台上完美运行

然后我将这些代码复制到我新安装的linux系统(Ubuntu13.10和GCC4.8.1),然后我用CDT安装了最新版本的eclipse(3.8.1左右),并用系统的GCC编译器对其进行了配置

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

GCC编译它时没有错误,也没有警告,程序可以在琐碎的工作负载下正常运行,但是,只要我给程序一些真实的负载,它基本上就会冻结,需要永远完成(在Windows中,同一个程序可以在几秒钟内完成“真实世界”的负载)

谁能告诉我我应该找什么来解决这个问题,或者GCC在调试模式下的速度太慢(我的意思是,至少比ICC/MSVC的调试模式慢2-3个数量级),谢谢

发布模式的投诉优化级别设置为O3,调试模式的默认设置(无优化,或者至少我认为是这样)

问题是,我觉得ICC/MSVC的调试模式(没有优化)二进制比GCC的快很多(我的意思是,大约快1000倍)

更新:(目前我似乎无法在stackoverflow发表评论,所以我必须在这里回复,抱歉):

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

至于代码的瓶颈,我认为它的内存有限

大部分时间(80+%)代码都在对大型输入数据数组进行基数排序,我编写的优化基数排序代码在Windows中每秒可以对2-3亿个32位浮点值进行排序,但在相同的硬件条件下,在linux中,对1000万长度的数据数组进行排序似乎需要几个小时,如果不是永远的话

更新:


感谢大家的帮助,我发现问题出在我用linux弄乱的某个宏上,现在一切正常。

您有三个选择:

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

我同意一些人的说法,他们说在gdb之类的调试器下运行它,然后用Ctrl-C(在程序的输出窗口中)中断它。然后在
gdb
中说
thread1
,使其进入活动线程。然后说
bt
获得堆栈跟踪。 然后通过在堆栈上键入
up
down
(必要时,通过键入
p variablename
)来检查每一行代码,这样您就可以确切地了解它为什么要执行中断时正在执行的操作

因为你知道它需要的时间比它应该的要长,这意味着你在行为不端时抓住它的机会是非常接近确定的

(注意:无需1.将其视为测量问题,或2.尝试区分无限循环或长期运行。)


这就是技术。

除了我想提到的所有其他建议之外,GCC还提供了一个可以提高调试版本性能的方法。

您是否使用了“top”或其他命令/工具来监控系统资源的运行时(分布)。。。。要更深入地了解处理过程中的内存消耗和CPU负载

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

使用调试器,可以确定在何处、在哪个子流程中消耗了如此多的时间/资源。在确定了这一点之后,您可以专注于解决特定的问题/不规则性/bug/资源消耗者


您是否也在非调试模式下运行可执行文件(“运行”而不是“调试”)?如果是,您可以比较相对的“性能”

您在ICC和GCC中使用哪种优化标志?eclipse在这方面起到了什么作用?你的程序使用什么系统调用?瓶颈是什么,CPU、磁盘I/O还是什么?你是说它永远不会完成,还是说它确实完成了,但需要很长时间?使用探查器。顺便问一下,您的程序是否出于任何原因访问网络?在类似于
gdb
的调试器中运行该程序,并不时中断它,以查看它在哪里花费了大部分时间。更好的方法是使用像
valgrind
这样的探查器。是的,如果程序从未退出,大多数探查器都不会做任何有用的事情。我会选择调试器路线。无限循环(或块)和长时间运行作业之间的区别在于逻辑错误和优化问题之间的区别。它还确定探查器是否有趣。不过,我会先选择随机暂停路线。@ams:一个只运行一年或永远只运行1秒的程序在我看来并没有太大区别。但那只是我:)哈哈,长跑的时候我想的更多的是5分钟。如果它能够在不被破坏的情况下实现这一点,那么一年的优化将是极其糟糕的。