C 附加到进程是否会使其行为不同?

C 附加到进程是否会使其行为不同?,c,debugging,C,Debugging,虽然我知道调试版本和发布版本之间的区别,但我很好奇,将调试器附加到进程(构建版本或调试版本)是否会改变进程的行为 作为参考,我正在开发HP 11.31安腾,但仍然对一般情况感到好奇。当然可以,这取决于平台和调试方法。例如,当函数实际存在时。如前所述,可以绕过该功能,但还有其他方法。所以基本上,这很复杂。是的,我经常发现在进程上附加一个调试器会立即使bug消失,但当我在发布模式下编译应用程序时,它们又会重新出现。不幸的是,我通常不能要求我的所有用户打开一个调试器来运行我的应用程序,所以这可能会非常

虽然我知道调试版本和发布版本之间的区别,但我很好奇,将调试器附加到进程(构建版本或调试版本)是否会改变进程的行为


作为参考,我正在开发HP 11.31安腾,但仍然对一般情况感到好奇。

当然可以,这取决于平台和调试方法。例如,当函数实际存在时。如前所述,可以绕过该功能,但还有其他方法。所以基本上,这很复杂。

是的,我经常发现在进程上附加一个调试器会立即使bug消失,但当我在发布模式下编译应用程序时,它们又会重新出现。不幸的是,我通常不能要求我的所有用户打开一个调试器来运行我的应用程序,所以这可能会非常令人沮丧。


当然,附加调试器会改变计时(这可能会改变,例如线程竞争条件),并且一些系统调用可以检测是否附加了调试器。

是的,当附加调试器时,Windows数据结构中的许多内容都会改变。它改变了内存的分配/释放方式,在堆栈上添加了额外的内务管理代码和“标记”(注意过新分配内存中的F00D值),事实上,反调试器使用许多更改来检测是否正在调试应用程序

在解释语言(Java、.NET)中,在调试器下运行时,运行时通常会生成不同的机器指令,以帮助捕获和显示异常、显示原始代码等。附加调试器时,运行时通常也会生成未优化的代码


其中一些更改会影响软件的行为方式,并可能导致复杂的暂时性错误,这些错误是由优化或非常精细的时序依赖关系引起的。

另一件需要记住的事情是,对于多线程应用程序,附加调试器肯定会产生非常不同的结果。这些都是被称为“Heisenbug”的东西。

当然,在多线程应用程序中,附加调试器可以产生不同的结果。 但是,与线程无关的代码又如何呢

我看到一个附带了调试器的发布版本没有问题。但是,当调试器未连接时,它会出现问题。

如果先启动调试器并附加了调试器,则也会显示相同的问题。

您是否将调试器附加到发布版本,还是使用调试标志进行编译?使用调试标志进行编译通常会使内存的行为略有不同。我对附加调试器的行为感到好奇。我并不是真的想了解调试版本和发布版本的效果。@ojblass:嗨,为了更清楚,重写你的Q。希望你能接受。你所说的是,申请者可能会发现,但我怀疑这是发问者想要知道的。解释应用程序可以在没有意图的情况下以多种方式进行不同的操作是非常有用的,因为这是调试中经常出现的情况。这个问题并不是关于行为的有意/无意更改的具体问题。正如你所注意到的,两者都有。其他回答者已经深入研究了调试模式中无意更改的机制。如前所述,速度较慢的诊断内存分配器对某些错误的宽容度也相对较高。