我偶然发现了一个非常有趣的问题,即我的应用程序中的一个函数(必须处理Windows剪贴板)只有在函数内部遇到断点时才能正常工作.这让我想知道,调试器在遇到断点时究竟做了什么(VS2008,C++)?
没有直接回答你的问题(因为我怀疑调试器的内部工作可能不是真正的问题),我将提供两个可能的原因,这可能是我以前见过的:
首先,当程序遇到断点时,程序会暂停,并且通常该延迟足以让某些事情发生(可能在另一个线程或另一个进程中),这必须在函数运行之前发生.验证这一点的一种简单方法是预先添加暂停几秒钟并正常运行程序.如果可行,您将不得不寻找更可靠的方法来找到问题.
其次,Visual Studio历史上(我不确定2008年)在调试模式下运行时会过度分配内存.因此,例如,如果你有一个已int[10]分配的数组,它应该通过权限获得40个字节的内存,但Visual Studio可能会给它44或更多,大概是在你有一个越界错误的情况下.当然,如果你有一个越界错误,这种过度分配可能会使它看起来无论如何都有效.
通常,对于软件断点,调试器会在您设置断点的位置放置中断指令.这将程序的控制权转移到调试器的中断处理程序,从那里你就可以在调试器可以决定做什么的世界里(给你一个命令提示符,打印堆栈并继续,你有什么.)
在一个相关的说明中,"这在调试器中有效,但在没有断点的情况下运行时"没有向我表明你有竞争条件.因此,如果您的应用是多线程的,请考虑检查锁定规则.
| 归档时间: |
|
| 查看次数: |
665 次 |
| 最近记录: |