我的应用程序需要释放一个非常大的哈希表,它在调试模式下速度非常慢,速度太快以至于无法实际使用它...但在发布模式下我根本没有调试符号。 我需要调试可执行文件并理解我应该能够将它与crt库的发行版本链接。 我这样做是通过改变我的“代码生成”选项来使用“多线程dll”而不是“多线程调试dll”,但是当我在我的哈希表中放置一个断点免费例程并跟随它进行实际的免费调用时,它是在调试dll中使用函数。
我还能尝试其他什么吗?使用发布配置是否是更好的选择,并尝试生成我实际需要调试的东西的符号?
(vs 2010 btw)
答案 0 :(得分:1)
在stdafx.h的开头添加它,或者将它定义为调试版本的预处理器宏:
#define _SECURE_SCL 0
它将导致以下情况发生,使您的代码在调试模式下运行得更快:
未选中所有标准迭代器(迭代器可以超出容器边界,导致未定义的行为)。 对于带有选中表格的标准函数,将使用未经检查的函数形式(参见下面的列表)。
如果输出迭代器是经过检查的迭代器:
- 您将在调用标准函数(例如std :: copy)时获得检查行为。
- 您将检查对已检查函数的调用行为(例如stdext :: checked_copy)。
- 对未经检查的函数(例如stdext :: unchecked_copy)的调用将获得检查行为。
如果输出迭代器是未经检查的迭代器:
- 您将在调用标准函数(例如std :: copy)时获得未经检查的行为。
- 调用已检查的函数(例如stdext :: checked_copy)将导致编译器警告。
- 对未经检查的函数(例如stdext :: unchecked_copy)的调用将获得未经检查的行为。
您可以在MSDN的Checked Iterators部分详细了解此行为。通常,您希望为Debug版本打开已检查的迭代器,但是某些应用程序会在很短的时间内执行大量操作,这些操作会成为麻烦。
答案 1 :(得分:1)
尽管使用了发布CRT并且已经启用了所有优化,但您可以拥有调试符号。实际上,这是Visual C ++在Release配置中默认的内容(请参阅项目属性/配置属性/ C / C ++ /常规/调试信息格式;以及链接器/调试/生成调试信息)。请注意,优化的代码可能更难调试 - 指令的顺序可能会被更改,并且某些部分可能会完全被优化掉,从而在单步执行时会导致一些意外行为。
顺便说一下,要关闭调试CRT,仅将“多线程调试DLL(/ MDd)”更改为“多线程DLL(/ MD)”是不够的,还需要删除{{ 1}}来自预处理器定义。话虽如此,您遇到的缓慢可能不是您的程序的结果 - 这可能是调试器工件(即,为了在调试器UI中显示它们而读取大型数据结构的速度慢)。请尝试运行您的程序(调试或发布配置 - 它没关系)外部调试器,看看这是否有所作为。
如果是这样,并且您不能仅为了调试而使哈希表变小,则必须采用“printf debugging”(即手动插入诊断)或者尝试远程调试。