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

时间:2009-04-25 07:47:54

标签: c debugging heisenbug

虽然我知道调试版本和发布版本之间存在差异,但我很好奇是否将调试器附加到进程(内置版本或调试)更改处理行为?

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

6 个答案:

答案 0 :(得分:5)

http://en.wikipedia.org/wiki/Heisenbug#Heisenbug

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

答案 1 :(得分:1)

当然可以,具体取决于平台和调试方法。例如,debugging on Windows时,实际上有IsDebuggerPresent函数。如上所述,可以规避功能,但还有其他手段。所以基本上,它很复杂。

答案 2 :(得分:1)

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

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

其中一些更改会影响软件的行为方式,并可能导致由优化或非常精细的timinig依赖性引起的瞬态错误。

答案 3 :(得分:0)

是的,我经常发现将调试器附加到进程会立即使错误消失,只有当我在发布模式下编译应用程序时才会重新出现它们。不幸的是,我通常无法让所有用户打开调试器只是为了运行我的应用程序,所以这可能会非常令人沮丧。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

当然,在多线程应用程序中,附加调试器会产生不同的结果。 但是,与线程无关的代码怎么样?

我看过一个发布版本,它附带了一个调试器,没有问题。但是,如果未附加调试器,则会出现问题 如果它首先启动并且附加了调试器,它也会显示相同的问题。