我有大量的代码,在Visual Studio的调试模式下运行大约需要5分钟,在发布模式下运行大约需要10秒。
当我必须在程序结束时调试代码时,这将成为一个巨大的问题,我必须等待太长时间才能使程序达到断点。
我给了序列化一个镜头,并使用boost :: serialize序列化调试代码之前的所有变量,但事实证明,反序列化所有这些变量仍然需要一两分钟。
那是什么给出的?我知道在调试模式下运行代码时会禁用许多优化和内联函数,但是我觉得非常奇怪的是,在调试模式下运行代码需要花费将近2个数量级。是否存在程序员用来绕过这个等待时间的黑客或东西?我知道有很多程序比我的计算密集程度更高,但我非常怀疑他们会等待5分钟只是为了让他们的调试代码达到一个断点。
答案 0 :(得分:2)
我有大量的代码,在Visual Studio的调试模式下运行大约需要5分钟,在发布模式下运行大约需要10秒。
这是正常的。
那是什么给出的?我知道在调试模式下运行代码时会禁用许多优化和内联内容,
这不是全部。除了msvc插入 MANY 健全性检查之外,特别是涉及stl容器时。例如,它会警告您关于不兼容的迭代器,std :: map中的命令比较器损坏以及许多其他类似问题。我认为它还在某种程度上检测内存损坏,缓冲区溢出,std :: vector的范围访问等等。这可能很有用,但开销很大。抛出一个特定的探测器,你的10秒也可以花30分钟完成。这也是正常的。
是否存在程序员用来绕过这个等待时间的黑客或东西?
除了使用它而不是#1 excuse ...
您可以在mingw上构建代码的调试版本 - 它不会插入(这种)健全性检查
您还可以调查源STL库并查看哪些宏启用了所有这些功能。它很可能被禁用。很有可能在msdn的某处记录了所述宏
您可以尝试为调试模式找到备用STL实现。
你也可以使用调试信息构建发布模式并调试它。
答案 1 :(得分:0)
这实际上意味着如果你在你想要断点的代码中插入故意的故障,你可以在没有连接调试器的情况下以快速释放模式运行代码,并在程序崩溃后开始调试。为了强制崩溃,我创建了一个空向量,并尝试访问空向量的元素。
然而,这种方法有一个重大的挫折,因为它是一次性使用。在程序崩溃并开始调试之后,除了查看监视列表和其他变量之外,您无法执行任何操作,这意味着由于您在技术上没有运行启用调试的进程,因此无法设置其他断点。
当然,这是一个非常巨大的挫折,但这并不意味着该方法不会有它的用途。
答案 2 :(得分:0)
取决于您要调试的内容。如果您已准备好容忍某些奇怪的行为,您通常可以自定义要调试的内容。尝试使用发布模式库启用优化(保持启用调试信息)。